https://www.acmicpc.net/problem/15486
๋ฌธ์
- ์ค๋๋ถํฐ N+1์ผ์งธ ๋๋ ๋ ํด์ฌ๋ฅผ ํ๊ธฐ ์ํด์, ๋จ์ N์ผ ๋์ ์ต๋ํ ๋ง์ ์๋ด์ ํ๋ ค๊ณ ํ๋ค.
- ๊ฐ๊ฐ์ ์๋ด์ ์๋ด์ ์๋ฃํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ๊ธฐ๊ฐ Ti์ ์๋ด์ ํ์ ๋ ๋ฐ์ ์ ์๋ ๊ธ์ก Pi๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- ์๋ด์ ์ ์ ํ ํ์ ๋, ์ป์ ์ ์๋ ์ต๋ ์์ต ๊ตฌํ๊ธฐ
์ ํ์ฌํญ
- N (1 ≤ N ≤ 1,500,000)
- 1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000
ํ์ด
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์กฐ๊ฑด์ธ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๋ง์กฑํ๋ค. ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ๊ฐ์ ์ด์ฉํด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ๊ฐ์ ๊ตฌํ ์ ์๋ ๋ฌธ์ ์ด๋ค. ์์ 1์ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด๋ฉด, 7์ผ์ด ๋๋ ๋ ์ ์ต๋๊ฐ์ 5์ผ์ด ๋๋ ๋ ์ ์ต๋๊ฐ์์ ๊ทธ ๋ ์ ๊ธ์ก์ ๋ํ ๊ฐ์ด ๋๋ค.
์ด๋ค ๋ ๊น์ง์ ์ต๋ ๊ธ์ก์ ์ ์ฅํ๊ณ , ํ์ฉํด์ผ ํ๋ค. ๋ฐ๋ผ์ dp[i]๋ i์ผ๊น์ง ์ป์ ์ ์๋ ์ต๋ ์์ต์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ DP์ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ๋ฌธ์ ์์ N + 1์งธ ๋๋ ๋ ํด์ฌ๋ฅผ ํ๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์, ์๋์ ํฌ๊ธฐ์ธ N์์ 1์ ๋ ์ถ๊ฐํด์คฌ๋ค. ์ต๋๊ฐ์ ๊ตฌํด์ผ ํ๋ฏ๋ก, DP์ ์ด๊ธฐ๊ฐ์ ๋ชจ๋ 0์ผ๋ก ์ด๊ธฐํ ํ๋ค.
- DP ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ
์ฒซ์งธ๋ ์ธ 1์ผ๋ถํฐ N์ผ๊น์ง DP ๋ฐฐ์ด์ ์ฑ์๋๊ฐ๋ค. ํ์ฌ ์๋ด์ ํ๋ค๊ณ ํ๋ฉด, '๋ค์ ์๋ด์ ๋ฐ๊ฒ ๋ ๊ธ์ก'์ 'ํ์ฌ๊น์ง์ ๊ธ์ก์ ์ต๋๊ฐ'์ '์ง๊ธ ์๋ด์ ํ ๊ฒฝ์ฐ์ ๊ธ์ก'์ ๋ํ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๊ทธ ๊ฐ์ด ์ต๋๊ฐ ์๋ ์๋ ์๋ค.
1์ผ | 2์ผ | 3์ผ | 4์ผ |
2 | 2 | 1 | 1 |
3 | 15 | 10 | 5 |
๋จผ์ , 1์ผ์ ์๋ด์ ํ๋ฉด, 3์ผ๊น์ง 3์ ๋ฐ์ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ 2์ผ์๋ ์๋ด์ ํ๋ฉด, 4์ผ๊น์ง 15๋ฅผ ๋ฐ์ ๊ฒ์ด๋ค. (์ด๋ฏธ ์ต๋๊ฐ)
๊ทธ๋ฆฌ๊ณ 3์ผ์๋ ์๋ด์ ํ๋ฉด 4์ผ๊น์ง 3 + 10์ ๋ฐ์ ๊ฒ์ด๋ค.
dp[i + time] = Math.max(dp[i + time], dp[i] + pay)
์ด๋ฏธ ์์ ์ต๋๊ฐ์ด ๋์์ผ๋ฏ๋ก, '๋ค์ ์๋ด์ ๋ฐ๊ฒ ๋ ๊ธ์ก'์ 'ํ์ฌ๊น์ง์ ๊ธ์ก์ ์ต๋๊ฐ'์ '์ง๊ธ ์๋ด์ ํ ๊ฒฝ์ฐ์ ๊ธ์ก'์ ๋ํ ๊ฐ๊ณผ '๋ค์ ์๋ด์ ๋ฐ๊ฒ๋ ๊ธ์ก์ ์ต๋๊ฐ' ์ค ํฐ ๊ฐ์ด ๋์ด์ผ ํ๋ค.
๋ฐ๋ก) ์๋ด์ ์ํ๊ณ ๋๊ธธ ์๋ ์๋ ๊ฒฝ์ฐ๋ ์ฒ๋ฆฌํ๊ธฐ
์์ 4์ ๊ฒฝ์ฐ์ ๊ฐ์ด, ํด๋น ์ผ์ ์๋ด์ ์ํ๊ณ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์ต๋๊ฐ ๋ ์๋ ์๋ค.
1) 7์ผ์ ์๋ด์ ํ๋ ๊ฒฝ์ฐ
1์ผ | 2์ผ | 3์ผ | 4์ผ | 5์ผ | 6์ผ | 7์ผ | 8์ผ | 9์ผ | 10์ผ |
5 | 4 | 3 | 2 | 1 | 1 | 2 | 3 | 4 | 5 |
50 | 40 | 30 | 20 | 10 | 10 | 20 | 30 | 40 | 50 |
50 + 10 + 30 = 80
2) 7์ผ์ ์๋ด์ ์ํ๋ ๊ฒฝ์ฐ
1์ผ | 2์ผ | 3์ผ | 4์ผ | 5์ผ | 6์ผ | 7์ผ | 8์ผ | 9์ผ | 10์ผ |
5 | 4 | 3 | 2 | 1 | 1 | 3 | 4 | 5 | |
50 | 40 | 30 | 20 | 10 | 10 | 30 | 40 | 50 |
50 + 10 + 30 = 90 ์ผ๋ก ๋ ํฌ๋ค.
dp[i + 1] = Math.max(dp[i + 1], dp[i])
7์ผ์์ ์๋ด์ ํ์ง ์์ผ๋ฉด, 8์ผ์๋ 7์ผ์ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ๊ฒ ๋๋ค. ๋ง์ฝ ์ด๋ฏธ ์ต๋๊ฐ์ด ์๋ค๋ฉด ์ด๋ฏธ ์๋ ์ต๋๊ฐ์ด 8์ผ์ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[N + 1][2];
for(int i = 1; i <= N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
int[] dp = new int[N + 2];
for(int i = 1; i <= N; i++) {
int time = arr[i][0];
int pay = arr[i][1];
if(i + time <= N + 1) {
dp[i + time] = Math.max(dp[i + time], dp[i] + pay);
}
dp[i + 1] = Math.max(dp[i + 1], dp[i]);
}
System.out.println(dp[N + 1]);
}
}
๊ฒฐ๊ณผ
๋ฐฐ์ด์
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 18513๋ฒ : ์ํฐ (0) | 2024.01.27 |
---|---|
๋ฐฑ์ค 1937๋ฒ : ์์ฌ์์ด ํ๋ค (0) | 2024.01.26 |
๋ฐฑ์ค 20440๋ฒ : ๐ต๋๊ฐ ์ซ์ด ์ซ์ด ๋๋ฌด ์ซ์ด ์ซ์ด ์ค์ง ๋ง ๋ด๊ฒ ์ฐ์ฉ๋์ง๋ง๐ต - 1 (0) | 2024.01.13 |
๋ฐฑ์ค 1749๋ฒ : ์ ์๋ฐ๋จน๊ธฐ (0) | 2024.01.12 |
๋ฐฑ์ค 14846๋ฒ : ์ง์ฌ๊ฐํ๊ณผ ์ฟผ๋ฆฌ (0) | 2024.01.12 |