-

2156 포도주 시식 본문

Algorithm/Baekjoon

2156 포도주 시식

Boogallee 2018. 2. 1. 16:26



계단오르기 문제와 비슷한 DP 문제이다.


계단 오르기와 비슷하게 기준을 만들어야 한다. 기준없이 경우를 고려하면 점화식을 세우기 힘들다.


포도주 잔의 갯수를 1 부터 시작하여 차례대로 dp를 만들어 나간다.


1잔일 경우 당연히 dp[1] = a[1]; 이다. dp[2] = a[1] + a[2]; 가 된다.


3잔 부터는 기준이 필요.

(3잔 이후로는 같은 원리가 적용됨)


*연속된 세잔은 불가능 하다.


1. 마지막 잔을 마시지 않을 경우   dp[n] = dp[n-1];   


2. 마지막 잔을 마시는데 첫 번째 잔일 경우.  dp[n] = dp[n-2] + a[n];

 

3. 마지막 잔을 마시는데 두 번째 잔일 경우. dp[n] = dp[n-3] + a[n-1] + a[n];


이렇게 경우를 나누어 주면 문제는 굉장히 쉽게 풀린다.



코드:

#include <iostream>


using namespace std;


int max(int a, int b, int c){


int tmp = a > b ? a : b;

return tmp > c ? tmp : c;

}


int main(){

int n;

int a[10001] = { 0, };

int dp[10001] = { 0, };

cin >> n;


for (int i = 1; i <= n; i++){

cin >> a[i];

}

dp[1] = a[1]; dp[2] = a[1] + a[2];

for (int i = 3; i <= n; i++){

dp[i] = max(dp[i - 1], dp[i - 2] + a[i], dp[i - 3] + a[i - 1] + a[i]);

}

cout << dp[n];


return 0;

}



'Algorithm > Baekjoon' 카테고리의 다른 글

10216 Count Circle Group  (0) 2018.02.11
11066 파일 합치기[DP]  (0) 2018.02.07
1005 ACM craft  (0) 2018.02.01
1463 1만들기  (0) 2018.01.30
2579 계단오르기  (0) 2018.01.30
Comments