문제 : https://www.acmicpc.net/problem/14863
[ 알고리즘풀이 ]
2차원 DP 배열을 이용하면 문제를 해결할 수 있습니다.
'DP[i][j] := 구간 i를 j분 안에 지났을 때 최대로 얻을 수 있는 금액' 으로 정의하면 됩니다.
i == 1인 첫 번째 구간에서만 초기값을 설정해주고, 그 뒤로는 들어온 입력 값에 따라 현재 j 분에서 도보 혹은 자전거로 이동할 수 있는 경우(시간이 K분을 안 넘는 경우) 만 DP 배열을 갱신해주면 됩니다.
#include<iostream>
#include<algorithm>
using namespace std;
int dp[101][100001] = {};
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, K, a, b, c, d;
cin >> N >> K;
for (int i = 1; i <= N; i++){
cin >> a >> b >> c >> d;
if(i == 1){
dp[i][a] = b;
dp[i][c] = max(dp[i][c], d);
}
else {
for (int j = 0; j <= K; j++) {
if (dp[i - 1][j] == 0) continue; // 전에 도시도 안밟은경우.
else {
if (j + a <= K) //시간이넉넉
dp[i][j + a] = max(dp[i][j + a], dp[i - 1][j] + b);
if (j + c <= K)
dp[i][j + c] = max(dp[i][j + c], dp[i - 1][j] + d);
}
}
}
}
int m = -1;
for (int i = 1; i <= K; i++)
m = max(m, dp[N][i]);
cout << m;
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 1406 : editor - travelbeeee (0) | 2020.02.03 |
---|---|
[BOJ] 1024 : 수열의 합 - travelbeeee (0) | 2020.02.03 |
[BOJ] 18311 : 왕복 - travelbeeee (0) | 2020.01.31 |
[BOJ] 18353 : 병사 배치하기 - travelbeeee (0) | 2020.01.30 |
[BOJ] 2630 : 색종이 만들기 - travelbeeee (0) | 2020.01.29 |