Study hard
(c++)백준 15486번: 퇴사 2 본문
15486번: 퇴사 2
첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)
www.acmicpc.net
[풀이]
2020/09/14 - [백준/DP] - (c++)백준 14501번: 퇴사
(c++)백준 14501번: 퇴사
www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net [풀이] DP로 풀 수 있는 문제였다. DP[i]: i번째 날 상담하면 그 이후부터 최대로 받을..
nim-code.tistory.com
이전에 퇴사 문제를 푼 방식대로 N번째 날부터 거꾸로 DP를 사용하여 풀려고 했지만 N의 크기가 커졌기 때문에 시간초과가 났다.
그래서 앞에서부터 현재까지 벌 수 있는 최대 이익을 계산하는 방식으로 DP를 사용했다.
DP[i]: i번째 전날까지 상담해서 벌 수 있는 최대 이익
점화식
Max: 지금까지의 벌 수 있는 최대 이익
DP[i + T[i]] = max(DP[i + T[i]], Max + P[i]);
#include <iostream>
#include <algorithm>//max
#define Max 1500001
using namespace std;
int N;
int T[Max];
int P[Max];
int DP[Max] = { 0, };
void solution() {
DP[1] = 0;
int ans = 0;
for (int i = 1; i <= N + 1; i++) {
ans = max(ans, DP[i]);
if (i + T[i] > N + 1)
continue;
else {
DP[i + T[i]] = max(DP[i + T[i]], ans + P[i]);
}
}
cout << ans << '\n';
}
int main() {
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> T[i] >> P[i];
}
solution();
return 0;
}
'백준 > DP' 카테고리의 다른 글
(c++)백준 15989번: 1, 2, 3 더하기 4 (0) | 2020.09.14 |
---|---|
(c++)백준 10942번: 팰린드롬? (0) | 2020.09.14 |
(c++)백준 14501번: 퇴사 (0) | 2020.09.14 |
(c++)백준 11060번: 점프 점프 (0) | 2020.09.13 |
(c++)백준 11048번: 이동하기 (0) | 2020.09.13 |