포도주 시식
포도주를 최대한 마시려고 한다. 앞에서 부터 잔들을 마실 수 있지만, 연속해서 세잔은 마실 수 없다.
계단 문제(http://js1jj2sk3.tistory.com/85?category=725178)와 같은 상황이다.
다만 한 번에 한 층만 오를 수 있게 조건만 변화했을 뿐이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n; int arr[10000]; int dp[10000][3]; int func(int p, int cnt) { if (p >= n) return 0; int& ref = dp[p][cnt]; if (ref != -1) return ref; if (cnt == 0) { int a = func(p + 1, 1) + arr[p]; int b = func(p + 1, 0); return ref = max(a, b); } else if (cnt == 1) { int a = func(p + 1, 2) + arr[p]; int b = func(p + 1, 0); return ref = max(a, b); } else return ref = func(p + 1, 0); } int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &arr[i]); memset(dp, -1, sizeof(dp)); printf("%d", func(0, 0)); return 0; } | cs |
'알고리즘 > Dynamic Programming 동적계획법' 카테고리의 다른 글
백준)15673 헤븐스 키친 2 (0) | 2018.10.02 |
---|---|
백준) 2965 캥거루 세마리 (0) | 2018.02.06 |
백준) 1463 1로 만들기 (0) | 2018.02.02 |
백준) 2579 계단 오르기 (0) | 2018.02.02 |
백준) 1149 RGB거리 (0) | 2018.02.01 |