728x90
포도주 시식
https://www.acmicpc.net/problem/2156
<코드>
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 | #include <stdio.h> int max(int a, int b){ return a > b ? a : b; } int main(void){ int N; int wine[10010] = {}; int Dp[10010] = {}; scanf("%d", &N); for (int i = 1; i <= N; i++) scanf("%d", &wine[i]); for (int i = 1; i < 3 && i <= N; i++){ if (i == 1) Dp[i] = wine[i]; else Dp[i] = wine[i] + wine[i - 1]; } for (int i = 3; i <= N; i++){ int result = 0; result = max(wine[i] + Dp[i - 2], Dp[i - 1]); result = max(result, wine[i] + wine[i - 1] + Dp[i - 3]); Dp[i] = result; } printf("%d\n", Dp[N]); } | cs |
<문제 푼 요령>
1. 이 문제 같은경우는 포도주를 세개를 연속을 먹을 수없다는 것을 고려해서 메모라이션 하면 된다.
2. 즉 현재 먹는 포도주의 합이 최대일 경우를 생각해보면
- 내가 현재의 포도주를 먹지 않았을 경우와
- 현재의 포도주를 마시고 이전꺼를 안마실 경우
- 현재의 포도주와 이전의 포도주를 마신 경우
3. 이렇게 3개의 경우를 따져서 저장해 주면 된다. 즉
- Dp[i-1] : 내가 현재의 포도주를 먹지 않았을 경우와
- wine[i] + Dp[i-2] : 현재의 포도주를 마시고 이전꺼를 안마실 경우
- wine[i] + wine[i-1] + Dp[i-3] :현재의 포도주와 이전의 포도주를 마신 경우
4. 저 3개의 값만 비교하면 최대값을 구할 수 있다.
728x90
'Algorithm > DP(동적 계획법)' 카테고리의 다른 글
[백준][11055번][DP] 가장 큰 증가 부분 수열 (0) | 2016.04.14 |
---|---|
[백준][11053번][DP] 가장 긴 증가 부분 수열 (4) | 2016.04.14 |
[백준][2193번][DP] 이친수 (3) | 2016.04.13 |
[백준][11057번][DP] 오르막 수 (0) | 2016.04.13 |
[백준][10844번][DP] 쉬운 계단 수 (3) | 2016.04.13 |
댓글