[문제보기]
2156. 포도주 시식
2156번: 포도주 시식
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규
www.acmicpc.net
[풀이과정]
이 문제는 저번에 풀었던 계단 오르기 문제랑 비슷한 형태를 띠고 있는 문제이다.
하지만 계단 오르기와 다른 점은 조건에 맞춰 선택을 할 수 있다는 점이다.
선택을 할 수 있다는 것은 내가 한번 안 먹을 경우와, 두 번 연속 안 먹을 경우가 있다는 뜻이다.
예를 들어 100, 400, 2, 1, 4, 200 이 주어졌을 때,
첫 번째, 두 번째를 선택 후 세, 네 번째 포도주는 건너뛰고, 다섯 번째, 여섯 번째 포도주를 선택하는 경우가
포도주를 제일 많이 먹을 수 있는 경우가 된다.
따라서 점화식으로는
dp[i] = max(dp[i-3]+arr[i-1]+arr[i], dp[i-2]+arr[i]); 를 하고
dp[i] = max(dp[i-1], dp[i]); 식을 한번 더 검사를 해줘야 된다.
[소스코드]
#include <iostream>
using namespace std;
int main(){
int dp[10001] = {0};
int arr[10001] = {0};
int n;
cin >> n;
for(int i=1; i<=n; i++){
cin >> arr[i];
}
dp[1] = arr[1];
dp[2] = arr[1]+arr[2];
int Max = dp[2];
for(int i=3; i<=n; i++){
dp[i] = max(dp[i-3]+arr[i-1]+arr[i], dp[i-2] + arr[i]);
dp[i] = max(dp[i], dp[i-1]);
Max = max(Max, dp[i]);
}
cout << Max;
}
[해결 과정 중 실수한 부분]
처음 문제를 읽고 계단 오르기와 비슷한 문제로 코드를 짠 거까지는 빨랐지만, 계속 틀리게 나와
반례를 찾아서 확인을 해보니 두 번 연속을 건너뛰는 경우를 생각 안 해줬었다.
'알고리즘 스터디 > Beakjoon' 카테고리의 다른 글
[백준 19238][C++] 스마트 택시 (Gold 4) (0) | 2020.09.03 |
---|---|
[백준 2748][C++] 피보나치 수2 (Silver 5) (0) | 2020.09.02 |
[백준 2193][C++] 이친수 (0) | 2020.08.29 |
[백준 1932][C++] 정수 삼각형 (Silver 1) (0) | 2020.08.29 |
[백준 2579][C++] 계단 오르기 (Silver 3) (0) | 2020.08.28 |