출처 : https://www.acmicpc.net/problem/2156
2156번: 포도주 시식
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규
www.acmicpc.net
고려사항
- i 번째 포도주를 안마신다면, i-1번째 포도주를 안마심(0), 마셨는데 연속 1잔째임(1), 마셨는데 연속 2잔째임(2) 를 나타내는
memo[i-1][0~2] 중 최대값을 계산해야 함.
- 재귀로 구현했더니 몇몇 테스트 케이스에서 답이 안구해짐...
아마도 아까 언급한, 안 마셨을 때의 값이 이전 인덱스의 모든 값중 최대값을 구해야하는데,
재귀로 할 경우 반복문으로 구하는 경우와 달리 memo[i-1][2] 가 호출되기 전에 memo[i-2][cnt] 가 호출되어
초기값인 -1 로 계산이 되어서 그런것 같음..!
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int n, ans = -1;
int wine[10001];
int memo[10001][3];
void dp(){
memo[1][0] = 0;
memo[1][1] = wine[1];
memo[1][2] = -1;
memo[2][0] = wine[1];
memo[2][1] = wine[2];
memo[2][2] = wine[1] + wine[2];
for(int i=3;i<=n;++i){
memo[i][0] = max(memo[i-1][0], max(memo[i-1][1], memo[i-1][2]));
memo[i][1] = memo[i-1][0] + wine[i];
memo[i][2] = memo[i-1][1] + wine[i];
}
ans = max( memo[n][0], max(memo[n][1], memo[n][2]));
return;
}
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>wine[i];
}
memset(memo,-1,10001*3*4);
dp();
cout<<ans;
return 0;
}
'BOJ 백준 > Dynamic Programming' 카테고리의 다른 글
백준 02407 - 조합 (0) | 2020.11.15 |
---|---|
백준 11660 - 구간 합 구하기 5 (0) | 2020.11.14 |
백준 10844 - 쉬운 계단 수 (0) | 2020.10.26 |
백준 01463 - 1로 만들기 (0) | 2020.10.26 |
백준 02565 - 전깃줄 (0) | 2020.10.25 |