๐ ๋ฌธ์
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ฒ์์๋ ์์์๋ถํฐ ๊ณ์ฐ์ ํ๋ ค๊ณ ํ์๋ค.
์๋ฅผ ๋ค์ด, dp[n] ์ n์ผ๊น์ง ์๋ด์ ํ์ ๋ ์ป์ ์ ์๋ ์ต๋ ์ด์ต์ด๋ผ๊ณ ํ๋ค๋ฉด
๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์กฐํฉํด์ ๊ทธ ์ค max ๊ฐ์ ์ฐพ์์ dp์ ์ ์ฅํ๋ ค๊ณ ํ๋๋ฐ
์ด๋ ๊ฒ ํ๋ค๋ณด๋ ์์ธ ์ฒ๋ฆฌ ํด์ค์ผ ํ ๊ฒ์ด ๋๋ฌด ๋ง์์ ๊ฒฐ๊ตญ ๊ตฌ๊ธ๋ง์ ๋์์ ๋ฐ์๋ค.
์ฒซ์งธ๋ ๋ถํฐ ๊ณ์ฐ์ ํด๋ ํ ์ ์๊ธด ํ์ง๋ง,
๋ง์ง๋ง ๋ ๋ถํฐ ๊ณ์ฐ์ ํ๋ค๋ฉด ์ฝ๋๋ ๊ฐ๊ฒฐํ๊ณ ํจ์ฌ ๋ ๊ฐ๋จํ๊ฒ ๋ต์ ๋์ถํ ์ ์๋ค!
๋ง์ฝ ์์ ๊ฐ์ ํ๊ฐ ์ฃผ์ด์ก๋ค๋ฉด,
1. dp[7]
7 + t[7] = 9 > 8 ์ด๋ฏ๋ก
7์ผ์ ์๋ ์๋ด์ ํ ์ ์๋ค.
๋ฐ๋ผ์ dp[7] = dp[8] = 0 (dp[n + 1] = 0์ผ๋ก ์ฌ์ ์ ์ด๊ธฐํ ํด์ค์ผ ํจ)
2. dp[6]
6 + t[6] = 10 > 8 ์ด๋ฏ๋ก
6์ผ์ ์๋ ์๋ด๋ ํ ์ ์๋ค.
๋ฐ๋ผ์ dp[6] = dp[7] = 0
3. dp[5]
5 + t[5] = 7 < 8 ์ด๋ฏ๋ก
5์ผ์ ์๋ ์๋ด์ ํ ์ ์๋ค.
์ด๋ 5์ผ์ ์๋ ์๋ด๊น์ง ํ๋๊ฒ ์ด๋์ผ์ง, ์๋๋ฉด ๊ทธ ๋ค์ ์๋ด๋ง ํ๋๊ฒ ์ด๋์ผ์ง๋ฅผ ๊ณ์ฐํด์ฃผ๊ธฐ ์ํด ๋น๊ต๋ฅผ ํด์ค์ผ ํ๊ณ
dp[5] = max(dp[6], dp[7] + p[5]) = dp[7] + p[5] = 15
4. dp[4]
4 + t[4] = 5 < 8 ์ด๋ฏ๋ก
4์ผ์ ์๋ ์๋ด์ ํ ์ ์๋ค.
dp[4] = max(dp[5], dp[5] + p[4]) = dp[5] + p[4] = 35
5. dp[3]
3 + t[3] = 4 < 8 ์ด๋ฏ๋ก
3์ผ์ ์๋ ์๋ด์ ํ ์ ์๋ค.
dp[3] = max(dp[4], dp[4] + p[3]) = dp[4] + p[3] = 45
6. dp[2]
2 + t[2] = 7 < 8 ์ด๋ฏ๋ก
dp[2] = max(dp[3], dp[7] + p[2]) = dp[3] = 45
7. dp[1]
1 + t[1] = 4 < 8 ์ด๋ฏ๋ก
dp[1] = max(dp[2], dp[4] + dp[1]) = dp[2] = 45
์ต์ข ๋ต์ผ๋ก dp[1]์ ์ถ๋ ฅํ๊ณ ์ข ๋ฃ!
๐ก ๋ด ์ฝ๋(C++)
Ver.1
// [14501] ํด์ฌ
// https://www.acmicpc.net/problem/14501
// dp, ๋ธ๋ฃจํธ ํฌ์ค
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
int n, next, n1, n2;
vector <int> t;
vector <int> p;
int dp[20];
t.push_back(0), p.push_back(0); // ์์ ์ธ๋ฑ์ค๋ฅผ 1๋ก ํ๊ธฐ ์ํด
cin >> n;
for(int i = 0 ; i < n ; i++) {
cin >> n1 >> n2;
t.push_back(n1); p.push_back(n2);
}
dp[n + 1] = 0;
for(int i = n ; i > 0 ; i--) {
next = i + t[i];
/*
n = 7, t[7] = 1 ์ธ ๊ฒฝ์ฐ 7์ผ์งธ์ ์๋ด๋ ํ ์ ์๊ธฐ ๋๋ฌธ์
next๋ (7 + 1) = 8 ๊น์ง๋ ๊ฐ๋ฅ
-> next > n + 1 ์ผ ๋๋ง dp[i] = dp[i + 1]
*/
if(next > n + 1) {
dp[i] = dp[i + 1];
}
else {
dp[i] = max(dp[i + 1], dp[next] + p[i]);
}
}
cout << dp[1] << endl;
}
Ver.2
// [14501] ํด์ฌ
// dp[i] = i๋ฒ์งธ ๋ ๋ถํฐ ๋ง์ง๋ง๋ ๊น์ง์ ์ต๋ ์ด์ต
#include <iostream>
using namespace std;
int n, t[16], p[16], dp[16];
int max(int a, int b)
{
if(a > b) return a;
else return b;
}
void getMaxProfit()
{
dp[n] = (t[n] == 1) ? p[n] : 0;
for(int i = n-1; i >= 1; i--) {
if(i + t[i] <= n + 1) {
dp[i] = max(dp[i+1], p[i] + dp[i + t[i]]);
}
else {
dp[i] = dp[i+1];
}
}
}
void input()
{
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> t[i] >> p[i];
}
}
int main(void)
{
input();
getMaxProfit();
cout << dp[1] << '\n';
}
'Baekjoon > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[11051] ์ดํญ ๊ณ์ 2 (0) | 2020.05.24 |
---|---|
[11048] ์ด๋ํ๊ธฐ (0) | 2020.05.24 |
[11052] ์นด๋ ๊ตฌ๋งคํ๊ธฐ (0) | 2020.04.19 |
[1003] ํผ๋ณด๋์น ํจ์(C++) (0) | 2020.04.05 |
[10844] ์ฌ์ด ๊ณ๋จ ์ (0) | 2020.04.05 |