[C++]BOJ 2156 - 포도주 시식

[C++]BOJ 2156 - 포도주 시식

보자 마자 계단 오르기문제와 똑같다고 생각했지만 계단 오르기는 무조건 마지막 계단을 밟아야 하는 반면, 포도주는 꼭 마지막을 안 마셔도 된다.

그래서 계단 오르기 방법에서는 마지막을 포함하도록 한정 지었던 반면에 포도주에선 단순히 dp[i - 1]이 값도 비교하게 하므로써 전에 있던 값이 더 크다면 그 값을 뒤로 밀도록 변경했다.

그것 말곤 다른것이 없다. (사실 n의 범위가 다르다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, d[10001], dp[10001];
int main() {
cin >> n;
for(int i = 1; i <= n; i++)
cin >> d[i];
dp[1] = d[1];
dp[2] = d[1] + d[2];
for(int i = 3; i <= n; i++)
dp[i] = max(max(d[i - 1] + dp[i - 3] + d[i], dp[i - 1]), dp[i - 2] + d[i]);
cout << dp[n];
}