https://www.acmicpc.net/problem/15486
โ๏ธ ๋ฌธ์
ํด๋น ๋ฌธ์ ๋ ๋ฐฑ์ค 14501๋ฒ (DFS) - ํด์ฌ ๋ฌธ์ ์ ๊ฐ์ง๋ง, ์๊ฐ ๋ณต์ก๋๊ฐ O(N) ์ผ๋ก ํด๊ฒฐ์ ํด์ผ ํต๊ณผํ ์ ์๋ ๋ฌธ์ ์ ๋๋ค.
๐ ๋ฌธ์ ํด๊ฒฐ
์ด๋ฒ์๋ DP๋ก ๋ฌธ์ ๋ฅผ ํ์ด์ผํฉ๋๋ค. ์ฐจ๊ทผ์ฐจ๊ทผ ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ํ ์ด๋ธ ์ ์
- ๋จผ์
dp[i]
๋ฅผ i์ผ ๊น์ง ๋ฐ์ ์ ์๋ ์ต๋ ์๋ด ๊ธ์ก์ด๋ผ๊ณ ์ ์ํ๊ฒ ์ต๋๋ค. (๋จ,1 <= i <= N+1
) N(ํด์ฌ์ผ) + 1
์ผ์ ์๋ด์ด ๋๋๋ ์ธ์ ์ด ๋๊ธฐ ๋๋ฌธ์ dp๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ N+2๋ก ํ์์ต๋๋ค.
// i์ผ๊น์ง ๋ฐ์ ์ ์๋ ์ต๋ ์๋ด ๊ธ์ก
int[] dp = new int[N+2];
2. ์ ํ์ ์ธ์ฐ๊ธฐ
์ ํ์์ ์์ ์ฐ๋ฆฌ๋ ๋จผ์ MAX ๊ฐ๊ณผ ํด๋น ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ด์ ๋ฐฐ์ด์ด ํ์ํฉ๋๋ค.
// MAX[0] = ์ต๋๊ฐ์ ์ธ๋ฑ์ค, MAX[1] = ์ต๋๊ฐ
int[] MAX = new int[2];
์ ํ์ํ์ง ์๋์์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ ๋ ฅ์ด ์๋์ ๊ฐ์ด ์ฃผ์ด์ง๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
3
1 5
3 1
1 3
i = 1 ์ธ ๊ฒฝ์ฐ
i๊ฐ 1์ผ ๋, ์๋ด์ด ๋๋ ๋ (i + T[i]
)์ ๊ฐ์ 2๊ฐ ๋ฉ๋๋ค.
i๊ฐ 2์ผ ๋๋ฅผ ๋ณด๋ฉด T[2] = 3
์ด๋ฏ๋ก, ํด๋น ์๋ด์ ํด์ฌ์ผ์ด ์ง๋ฌ์ผ๋ฏ๋ก ํ ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด dp[2]
์๋ P[i]
์ ๊ฐ์ด ์ ์ฅ๋์ด์ผ ํฉ๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๋์ด ์๋๋ผ, 2์ผ์ ์๋ ์๋ด์ ํ์ง ์๊ณ 3์ผ์ ์๋ ์๋ด์ ํ๋ค๋ฉด? 5+3 = 8
์ด๋์ด ์ต๋๊ฐ์ด ๋ ๊ฒ์
๋๋ค.
์ด์ ์ด๊ฒ์ ์ด๋ป๊ฒ ์ ํ์์ผ๋ก ๋ํ๋ด๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ 1๋ถํฐ N๊น์ง for๋ฌธ์ ๋๋ฉด์ MAX๊ฐ์ ๋น๊ตํ์ฌ ๊ฐ์ ๋ฃ์ด์ค๋๋ค.
for(int i=1; i<=N; i++) {
// ์ต๋๊ฐ ์ค์
if(MAX[1] < dp[i]) {
MAX[0] = i;
MAX[1] = dp[i];
}
}
๊ทธ ๋ค์ ์ฒดํฌํด์ผํ ์ฌํญ๋ค์ด ์์ต๋๋ค.
- ์ค๋(i) ์๋ด์ ํ๊ณ ๋๋ฉด ํด์ฌ์ผ(N)+1 ๊น์ง ๋๋ผ ์ ์๋์ง ํ์ธ์ ํด์ผํฉ๋๋ค.
- ์ค๋ ์๋ด์ด ๊ฐ๋ฅํ๋ค๋ฉด, MAX๊ฐ์ผ๋ก ์ง์ ๋ ๋ ์ด ์ค๋๋ณด๋ค ์ด์ ์ธ์ง ํ์ธ ํด์ผํฉ๋๋ค.
- ์ค๋๋ณด๋ค ์ด์ ์ด๋ผ๋ฉด,
MAX + P[i]
์dp[next]
์ ๋ฃ์ด์ค๋๋ค. (๊ฐ์ ๋ฃ์ด์ค ๋ ๋ฐ๋์ ์ต๋๊ฐ์ ๋ฃ์ด์ค์ผํฉ๋๋ค.) - ์ค๋๋ณด๋ค ์ดํ๋ผ๋ฉด,
dp[i] + P[i]
๊ฐ์dp[next]
์ ๋ฃ์ด์ค๋๋ค.
- ์ค๋๋ณด๋ค ์ด์ ์ด๋ผ๋ฉด,
int next = i + T[i];
if(next <= N+1) {
// ์ต๋๊ฐ์ธ ๋ ์ด ์๋ด๋๋๋ ๋ ์ด์ ์ด๋ผ๋ฉด
if(i > MAX[0]) {
dp[next] = Math.max(dp[next], MAX + P[i]);
}else {
dp[next] = Math.max(dp[next], dp[i] + P[i]);
}
}
3. ์ด๊ธฐ๊ฐ ์ค์
dp๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ 0์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
๐ ์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(bf.readLine());
int[] T = new int[N+1];
int[] P = new int[N+1];
int[] dp = new int[N+2];
for(int i=1; i<=N; i++){
st = new StringTokenizer(bf.readLine());
T[i] = Integer.parseInt(st.nextToken());
P[i] = Integer.parseInt(st.nextToken());
}
// [0] = ์ต๋ ๊ฐ์ ์ธ๋ฑ์ค ์ ์ฅ, [1] = ์ต๋ ๊ฐ ์ ์ฅ
int[] MAX = new int[2];
// 1๋ถํฐ ํ์
for(int i=1; i<=N; i++) {
// ์ค๋ ์๋ด์ด ๋๋๋ ์ผ ๊ณ์ฐ
int next = i + T[i];
if(MAX[1] <= dp[i]) {
MAX[0] = i;
MAX[1] = dp[i];
}
// ๋ง์ฝ ํด์ฌ์ผ+1์ ๋๋๋ค๋ฉด?
if(next <= N+1) {
// ์๋ด์ด ๋๋๋ ๋ ์ด ์ต๋๊ฐ์ ์ธ๋ฑ์ค๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด,
// i์ผ ์๋ด์ ์ด์ต์ด ์ ๋ค๋ ๋ป์ด๋ฏ๋ก, ์ต๋๊ฐ + P[i] ํฉ์ dp[next] ์ ๋ฃ์ด์ค๋๋ค.
if(next > MAX[0]) {
dp[next] = Math.max(dp[next], MAX[1] + P[i]);
}else {
dp[next] = Math.max(dp[next], dp[i] + P[i]);
}
}
}
int result = 0;
for(int i : dp) {
System.out.println(i);
if(result < i) result = i;
}
System.out.print("result : " + result);
}
}