문제
https://www.acmicpc.net/problem/11052
걸린 시간
02 : 12 : 18 실패
풀이
C++
#include <bits/stdc++.h>
#define INF 987654321
using namespace std;
int n;
int pack[1001], cache[1001];
int dp(int piece){
// 기저 사례
if(piece == n)
return 0;
// 메모이제이션
int& ret = cache[piece];
if(ret != -1)
return ret;
// 재귀 함수
for(int i = 1; i <= n; i++)
if(piece+i <= n)
ret = max(ret, dp(piece+i)+pack[i]);
return ret;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
memset(pack, 0, sizeof(pack));
memset(cache, -1, sizeof(cache));
cin >> n;
for(int i = 1; i <= n; i++)
cin >> pack[i];
cout << dp(0) << "\n";
return 0;
}
잦은 코딩실수로 기초 dp 문제를 2시간 씩이나 삽질한 문제이다.
- 각 단계에서 반환된 값에 현재가 아닌 이전 카드팩의 금액을 더하도록 코딩했다.
- 변수를 하나 더 두어 금액을 계속 누적해나가는 방법을 사용했다.
1번은 설명하기도 부끄러운 실수이다. 2번은 dfs 처럼 기저 사례에서 목적이 달성되는 문제에 어울리는 방법이다. 또 누적된 금액을 메모이제이션에 이용하는 것은 경우에 따라 완전 탐색과 차이가 없을 수 있다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 2293번 동전 1 (0) | 2020.09.10 |
---|---|
Baekjoon 9465번 스티커 (0) | 2020.09.09 |
Baekjoon 1138번 한 줄로 서기 (0) | 2020.09.08 |
Baekjoon 2631번 줄세우기 (0) | 2020.09.08 |
Baekjoon 19638번 센티와 마법의 뿅망치 (0) | 2020.09.07 |
댓글