[문제보기]
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net
[풀이과정]
문제를 보자마자 다이내믹 프로그램(dp)으로 풀어야겠다고 생각했다.
이중 포문을 사용하여 코드를 짰는데, 2가지 경우의 수를 사용하여 dp의 갱신을 진행하였다.
1. j 번째 날까지 일을 안 하고 i 번째 날까지 온 경우의 점화식 max(dp[i], dp[j])
2. j 번째 날에서 data[j]. second 기간 동안 일을 하여 돈을 받을 경우 j+data[j].second 하여 i 번째
날에 돈을 받는 경우의 점화식 max(dp[i], dp[j]+data[j].second)
이렇게 세웠다.
그리고 문제에서는 n <= 15인데 배열을 16으로 만들었는데 이는 딱 n번째 날까지 일을 하여 돈을 받을 수 있으므로
16으로 정하였다.
[소스코드]
#include <iostream>
using namespace std;
int n;
pair<int, int> data[16];
int dp[16] = {0};
int ans = 0;
int main(){
cin >> n;
int t, p;
for(int i=0; i<n; i++){
cin >> t >> p;
data[i].first = t;
data[i].second = p;
}
for(int i=0; i<=n; i++){
for(int j=0; j<i; j++){
dp[i] = max(dp[i], dp[j]);
if(j+data[j].first == i){
dp[i] = max(dp[i], dp[j] + data[j].second);
}
}
}
for(int i=0; i<=n; i++)
ans = max(ans, dp[i]);
cout << ans <<"\n";
return 0;
}
[풀이과정 중 실수한 부분]
요새 dp문제를 많이 풀어서 어떤 식으로 접근을 해야 될지는 감이 잡히고 있지만, 모든 조건에 대한
점화식을 세우는 부분에서 조금 시간이 걸리고, 손으로 계산을 해봐야 식이 세워진다.
'알고리즘 스터디 > Beakjoon' 카테고리의 다른 글
| [백준 3190][C++] 뱀 (Gold 5) (0) | 2020.08.19 |
|---|---|
| [백준 14889][C++] 스타트와 링크 (Silver 3) (0) | 2020.08.18 |
| [백준 1038][C++] 감소하는 수 (Gold 5) (0) | 2020.08.13 |
| [백준 13458][C++] 시험 감독(Bronze 2) (0) | 2020.08.10 |
| [백준 12100][C++] 2048(Easy) (Gold 2) (0) | 2020.08.10 |