#문제
2156번: 포도주 시식
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규
www.acmicpc.net
#풀이 & 학습한 내용
supremo7.tistory.com/88에서 푼 이친수 문제와 유사한 문제이다. 이 문제는 경우를 크게 3가지로 나눠 문제를 관찰했다. 마신것을 1, 안마신것을 0이라 할 때, i-1번째와 i번째의 경우를 ?0,01,11로 나누었다.(?0은 00과 10을 모두 포함한다) 이때, 각각의 경우를 dp배열의 index 0, 1, 2에 저장하여 각각의 optimization을 관찰했다. dp[i][1]는 "index1상황에서 i번째 포도주까지의 최대량"으로 정의했다. dp[i][0],dp[2]도 index상황만 바꾸어 같게 정의했다.그리고 소스코드의 19~21행의 optimal substructure를 통해 dp배열을 n까지 채워나갔다. 그리고 답으로 dp[n][0],dp[n][1],dp[n][2] 중 최댓값을 출력해줬다.
dp배열을 1차원으로 선언해서 dp[i] = max(dp[i-1], dp[i-2]+p[i], dp[i-3]+p[i-1]+p[i])로 optimal substructure를 정의할 수도 있다.
#소스코드
|
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
|
#include<iostream>
#include<algorithm>
using namespace std;
int p[10002];
int dp[10002][3];
int main(void) {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i];
}
dp[1][0] = 0; dp[1][1] = p[1]; dp[1][2] = 0;
for (int i = 2; i <= n; i++) {
dp[i][0] = max({ dp[i - 1][0],dp[i - 1][1],dp[i - 1][2] });
dp[i][1] = dp[i - 1][0] + p[i];
dp[i][2] = dp[i - 1][1] + p[i];
}
cout << max({ dp[n][0],dp[n][1],dp[n][2] }) << '\n';
}
|
cs |
github.com/HoYoungChun/BOJ_algorithm/blob/master/Dynamic_Programming/BOJ_2156.cpp
HoYoungChun/BOJ_algorithm
Baekjoon Online Judge problem solving by C++. Contribute to HoYoungChun/BOJ_algorithm development by creating an account on GitHub.
github.com
'Algorithm > Dynamic Programming' 카테고리의 다른 글
| [C++] 백준 11722번 : 가장 긴 감소하는 부분 수열 (S2) (0) | 2020.11.15 |
|---|---|
| [C++] 백준 1932번 : 정수 삼각형 (S1) (0) | 2020.11.13 |
| [C++] 백준 9465번 : 스티커 (S2) (0) | 2020.11.12 |
| [C++] 백준 11057번 : 오르막 수 (S1) (0) | 2020.11.11 |
| [C++] 백준 1309번 : 동물원 (S1) (0) | 2020.11.11 |