728x90
next = i + arr[0][i];
if (next > n + 1) {
DP[i] = DP[i + 1];
}
else {
DP[i] = max(DP[i + 1], DP[next] + arr[1][i]);
}
다이나믹 프로그래밍 문제입니다.
n일동안 각 x일 걸리는 상담이 y라는 비용을 얻을때
가장 많이 비용을 얻은 값을 찾는 문제입니다.
마지막날 부터 각 최대값을 계산합니다.
1. n날 < 현재 날 + 상담 날
n+1날의 최대값을 가져옵니다.
2. n날 >= 현재날 + 상담 날
1) n+1날의 최대값과
2) 상담을 진행했을때 날짜의 최대값 + 현재 날짜 상담값
1), 2) 중 큰 값을 현재날의 최대값에 넣습니다.
#include <iostream>
#include <algorithm>
using namespace std;
int arr[2][20];
int DP[20];
int main(int argc, char *argv[])
{
int next;
int value;
int n;
cin >> n;
for (int i = 0; i <= n; ++i) {
arr[0][i] = 0;
arr[1][i] = 0;
}
for (int i = 1; i <= n; ++i) {
cin >> arr[0][i];
cin >> arr[1][i];
}
for (int i = n; i > 0; --i) {
next = i + arr[0][i];
if (next > n + 1) {
DP[i] = DP[i + 1];
}
else {
DP[i] = max(DP[i + 1], DP[next] + arr[1][i]);
}
}
cout << DP[1] << endl;
return 0;
}'알고리즘' 카테고리의 다른 글
| [C++] 백준 2167번 2차원 배열의 합 (0) | 2019.05.27 |
|---|---|
| [C++] 백준 9461번 파도반 수열 (0) | 2019.05.27 |
| [C++] 백준 1010번 다리 놓기 (0) | 2019.05.24 |
| [C++] 백준 11057번 오르막 수 (0) | 2019.05.24 |
| [C++] 백준 1309번 동물원 (0) | 2019.05.24 |