728x90
반응형
https://www.acmicpc.net/problem/2156
1. Logic
부분문제를 3가지로 나눌 수 있다.
포도주를 안마시는 경우
포도주를 1잔 연속해서 마시느 경우
포도주를 2잔 연속해서 마시는 경우
그래서 DP테이블을 정할 때 DP[현재 인덱스][선택 여부] 로 정의했다.
선택 여부 별 의미하는 바는 > 0:이전에 포도주 안마심, 1:이전에 한잔만 마심, 2:이전에 두잔 연속해서 마심
입력으로 받은 첫번째 수에서 선택할지 말지여부를 처리하는 것은, input배열의 0번째에 정답에 아무런 영향을 주지 않는 수 0을 넣어 처리해줬다.
2. Code
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> input;
int dp[10001][3];
//1: 안마심, 2:한번만 먹음 3:연속해서 먹음
int solve(int idx, int choice) {
if(idx == n + 1) return 0;
int &ret = dp[idx][choice];
if(ret != -1) return ret;
ret = solve(idx+1, 0);
if(choice == 0) ret = max(ret, solve(idx+1, 1) + input[idx]);
if(choice == 1) ret = max(ret, solve(idx+1, 2) + input[idx]);
return ret;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
memset(dp, -1, sizeof(dp));
cin >> n;
input.push_back(0);
for(int i = 0; i < n; i++) {
int a;
cin >> a;
input.push_back(a);
}
cout << solve(0, 0);
}
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
728x90
반응형
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 3151 합이 0 C++ :: Binary Search (1) | 2023.10.18 |
---|---|
[백준/Baekjoon] 14889 스타트와 링크 C++ :: Back Tracking & Brute Force (1) | 2023.10.17 |
[백준/Baekjoon] 10282 해킹C++ :: Dijkstra (0) | 2023.10.13 |
[백준/Baekjoon] 4179 불! C++ :: BFS (0) | 2023.10.12 |
[백준/Baekjoon] 2146 다리 만들기 C++ :: BFS (2) | 2023.10.11 |