Study hard

(c++)백준 15486번: 퇴사 2 본문

백준/DP

(c++)백준 15486번: 퇴사 2

Nimgnoej 2020. 9. 14. 14:41

www.acmicpc.net/problem/15486

 

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