반응형
1. 문제
https://www.acmicpc.net/problem/2156
2. 풀이
이 문제는 DP를 이용하여 푸는 문제이다.
중요한점은 dp[i]를 i번째 포도주(자기자신)을 먹은 여부에 따라 설정하는 것이다.
일단 첫번째로 i번째 포도주(자기자신)을 먹었다고 한다면
i번째 포도주(자기자신)을 먹었기 때문에
i-1번째 포도주를 안 먹었다면 dp[i] = dp[i-2] + arr[i]이다.
i-1번째 포도주를 먹었다면 dp[i] = dp[i-3] + arr[i-1] + arr[i]이다.
두번째로 i번째 포도주(자기자신)를 안먹었다고한다면
i-1번째 포도주를 먹든 안먹든 상관이 없어지기 때문에 dp[i]는 dp[i-1]이게 된다.
즉
dp[0] = 0, dp[1] = arr[1], dp[2] = dp[0] + dp[1]
i>=3, dp[i] = max(dp[i-2] + arr[i], dp[i-3] + arr[i-1] + arr[i], dp[i-1])
이렇게 점화식이 세워진다.
3. 소스코드
#include <iostream>
using namespace std;
int n, arr[10001], dp[10001];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> arr[i];
dp[0] = 0;
dp[1] = arr[1];
dp[2] = arr[1] + arr[2];
for (int i = 3; i <= n; i++)
dp[i] = max(dp[i - 1], max(dp[i - 2] + arr[i], dp[i - 3] + arr[i - 1] + arr[i]));
cout << dp[n];
}
4. 참고
질문, 고칠점 등 댓글 언제나 환영입니다.
반응형
'백준 > 일반 문제' 카테고리의 다른 글
[백준/BOJ] 1932 - 정수 삼각형 (c++) (DP) (0) | 2022.04.10 |
---|---|
[백준/BOJ] 9461 - 파도반 수열 (c++) (DP) (0) | 2022.04.10 |
[백준/BOJ] 10844 - 쉬운 계단 수 (c++) (DP) (2) | 2022.04.09 |
[백준/BOJ] 1463 - 1로 만들기 (c++) (DP) (0) | 2022.04.09 |
[백준/BOJ] 11726 - 2×n 타일링 (c++) (DP) (0) | 2022.04.09 |