[백준 2156번] 포도주 시식
2017. 5. 19. 01:37ㆍ알고리즘/백준
반응형
풀이
연속으로 세잔을 마시지 못하는 조건이 들어간것도 똑같다.
모든 경우의 수를 구해서 답을 구할 수 있지만 시간초과가 나므로 DP로 해결할 수 있다.
마실 수 있는 경우의 수를 3가지로 분류할 수 있다.
1. 현재 잔을 마셧을 경우
2. 이전잔과 현재잔 전전전잔을 마셧을 경우
3. 전전잔과 현재잔을 마셧을 경우
이 경우의 수의 최대값을 계속 DP배열에 저장해나가면 해결할 수 있다.
1 2 3 | 1. dp[i-1] 2. wine[i] + wine[i - 1] + dp[i - 3] 3. wine[i] + dp[i - 2]; | cs |
소스 코드
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 | #include <iostream> using namespace std; int n, wine[10001],dp[10001]; int Max(int a, int b) { return a > b ? a : b; } int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> wine[i]; } dp[0] = wine[0]; dp[1] = wine[0] + wine[1]; if (n == 1 || n == 2) { cout << dp[n - 1] << '\n'; return 0; } for (int i = 2; i <= n; i++) { dp[i] = Max(wine[i] + wine[i - 1] + dp[i - 3],Max(dp[i-1], wine[i] + dp[i - 2])); } cout << dp[n] << '\n'; return 0; } | cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2589번] 보물섬 (0) | 2017.05.21 |
---|---|
[백준 1912번] 연속합 (0) | 2017.05.19 |
[백준 1463번] 1로 만들기 (0) | 2017.05.17 |
[백준 1966번] 프린터 큐 (0) | 2017.05.16 |
[백준 2606번] 바이러스 (0) | 2017.05.16 |