[백준 2156번 C/C++] 포도주 시식
[백준 2156번 C/C++] 포도주 시식
https://www.acmicpc.net/problem/2156
해결전략
Dynamic Programming (DP) 동적 계획법
코드 - 방법1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector<int> v;
vector<int> dp;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
v.resize(n+2);
dp.resize(n+2);
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
dp[1] = v[1];
dp[2] = v[1] + v[2];
dp[3] = max(max(v[1] + v[3], v[2] + v[3]), v[1] + v[2]);
for (int i = 4; i <= n; i++)
{
dp[i] = max(max(dp[i - 3] + v[i - 1], dp[i - 2]) + v[i], dp[i-1]);
}
cout << dp[n];
return 0;
}
코드 - 방법2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector<int> v;
vector<vector<int>> dp;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
v.resize(n+2);
dp.resize(n+2, vector<int>(4));
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
dp[1][1] = v[1];
dp[2][0] = v[1];
dp[2][1] = v[2];
dp[2][2] = v[1] + v[2];
for (int i = 3; i <= n; i++)
{
dp[i][0] = max(dp[i-1][0], max(dp[i-1][1], dp[i-1][2]));
dp[i][1] = v[i] + dp[i-1][0];
dp[i][2] = v[i] + dp[i-1][1];
}
int answer = max(dp[n][0], max(dp[n][1], dp[n][2]));
cout << answer;
return 0;
}
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 2108번 C/C++] 통계학 (0) | 2023.07.08 |
---|---|
[백준 1916번 C/C++] 최소비용 구하기 (0) | 2023.07.07 |
[백준 1780번 C/C++] 종이의 개수 (0) | 2023.07.05 |
[백준 1992번 C/C++] 쿼드트리 (0) | 2023.07.04 |
[백준 14891번 C/C++] 톱니바퀴 (0) | 2023.07.03 |
댓글
이 글 공유하기
다른 글
-
[백준 2108번 C/C++] 통계학
[백준 2108번 C/C++] 통계학
2023.07.08 -
[백준 1916번 C/C++] 최소비용 구하기
[백준 1916번 C/C++] 최소비용 구하기
2023.07.07 -
[백준 1780번 C/C++] 종이의 개수
[백준 1780번 C/C++] 종이의 개수
2023.07.05 -
[백준 1992번 C/C++] 쿼드트리
[백준 1992번 C/C++] 쿼드트리
2023.07.04