https://www.acmicpc.net/problem/14501
https://www.acmicpc.net/problem/15486
해당 두 문제는 같은 다이나믹 프로그래밍 문제로, 첫 날부터 마지막 날까지 확인하면서 해당 날까지 일했을 때 얼마의 금액을 받을 수 있는지 저장해가면서 풀게 된다. 두 문제는 내용은 같지만 '퇴사 2' 문제에 주어지는 데이터의 크기가 훨씬 크기 때문에 제한 시간 내에 통과하기 위해서 풀이 방식을 개선했다. 두 문제 모두 Bottom-Up 방식으로 풀이했다.
1) 전체 날짜의 길이와 상담들의 정보(기간, 금액)를 입력받아 n
과 consultings
에 저장한다. dp는 전부 0으로 초기화한다.
2) dp
배열을 첫 날부터 마지막 날까지 갱신한다.
3) dp[n + 1]을 출력한다. (dp[n + 1] == n일까지 일했을 때 받는 최대 금액)
1) 전체 날짜의 길이와 상담들의 정보(기간, 금액)를 입력받아 n
과 consultings
에 저장한다. dp는 전부 0으로 초기화한다.
2) dp
배열을 첫 날부터 마지막 날까지 갱신한다.
3) dp[n + 1]을 출력한다.
1) DP를 전부 0으로 초기화 한다.
2) i = 1부터 n + 1까지 dp[i]를 갱신한다. 가장 처음으로 i = 1일 때
dp[1] = max(dp[0], dp[1]) -> dp[1] = 0
dp[1 + 3] = max(dp[1 + 3], dp[1] + 10) -> dp[4] = 10
3) i = 2일 때
4) i = 3일 때
5) i = 4일 때
6) i = 5일 때
7) i = 6일 때
8) i = 7일 때
8) i = 8일 때
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
typedef pair<int, int> pii;
int dp[16];
vector<pii> consultings;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int n;
cin >> n;
consultings.push_back(pii(0, 0));
for (int i = 1; i <= n; i++)
{
int a, b;
cin >> a >> b;
consultings.push_back(pii(a, b));
}
for (int i = 1; i <= n + 1; i++)
{
for (int j = 1; j < i; j++)
{
if (i >= j + consultings[j].first)
{
dp[i] = max(dp[i], dp[j] + consultings[j].second);
}
}
}
cout << dp[n + 1];
}
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
typedef pair<int, int> pii;
int dp[1500051];
pii consultings[1500051];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int a, b;
cin >> a >> b;
consultings[i] = pii(a, b);
}
for (int i = 1; i <= n + 1; i++)
{
dp[i] = max(dp[i], dp[i - 1]);
dp[i + consultings[i].first] = max(dp[i + consultings[i].first], dp[i] + consultings[i].second);
}
cout << dp[n + 1];
}