πŸ‘Š PS/Algorithm

[Baekjoon] 15486번: 퇴사 2

hades1 2024. 9. 10. 23:34

πŸ₯… 문제

https://www.acmicpc.net/problem/15486

 

πŸ” 섀계

데이터가 μ—„μ²­ 많고, μ΅œλŒ€μ˜ 이읡을 얻도둝 상담을 κ΅¬μ„±ν•˜λ―€λ‘œ, λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ λ°©ν–₯을 μž‘μ•˜λ‹€.

 

dp[i]μ—λŠ” 상담을 i번째 λ‚ κΉŒμ§€ ν–ˆμ„ λ•Œ, μ΅œλŒ€ 이읡을 μ €μž₯ν•œλ‹€.

 

iλ‘œλΆ€ν„° 상담이 λλ‚˜λŠ” 날은 i + μ†Œμš” λ‚  - 1이고, 이것을 finish_day둜 μ§€μ •ν•˜μ˜€λ‹€.

 

i번째 날에 상담을 μ‹œμž‘ν•œλ‹€λ©΄, 상담이 λλ‚œ λ‚  μ–»λŠ” 이득인 dp[finish_day]λŠ” dp[i-1] + 상담 이읡이닀. μ—¬κΈ°μ„œ dp[i]κ°€ μ•„λ‹Œ dp[i-1]을 더해야 함에 μœ μ˜ν•œλ‹€. dp[i]λŠ” i번째 λ‚ κΉŒμ§€ 상담이 μ΄λ£¨μ–΄μ§€λ―€λ‘œ 상담을 μ‹œμž‘ν•  수 μ—†λ‹€.

 

λ˜ν•œ, i번째 날에 상담이 λλ‚˜μ§€ μ•ŠλŠ” 경우λ₯Ό κ³ λ €ν•˜λ©΄, μ „λ‚ κΉŒμ§€μ˜ 이읡과 λΉ„κ΅ν•˜μ—¬ μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” dp[i] = max(dp[i], dp[i - 1]); λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

 

πŸ‘Š 풀이

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, finish_day, result;
vector<pair<int, int>> info(1500001);
vector<int> dp(1500001);

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> info[i].first >> info[i].second;

		dp[i] = max(dp[i], dp[i - 1]);

		finish_day = i + info[i].first - 1;
		if (finish_day > n) {
			continue;
		}
		dp[finish_day] = max(dp[finish_day], dp[i - 1] + info[i].second);

;	}

	for (int i = 1; i <= n; i++) {
		result = max(result, dp[i]);
	}

	cout << result << "\n";
	return 0;
}