๋ฌธ์
์์ฆ ๋ฏผ๊ท๋ค ๋๋ค์์๋ ์คํํธ๋งํฌ์์ ๋ง๋ PS์นด๋๋ฅผ ๋ชจ์ผ๋ ๊ฒ์ด ์ ํ์ด๋ค.
PS์นด๋๋ PS(Problem Solving)๋ถ์ผ์์ ์ ๋ช ํ ์ฌ๋๋ค์ ์์ด๋์ ์ผ๊ตด์ด ์ ํ์๋ ์นด๋์ด๋ค. ๊ฐ๊ฐ์ ์นด๋์๋ ๋ฑ๊ธ์ ๋ํ๋ด๋ ์์ด ์น ํด์ ธ ์๊ณ , ๋ค์๊ณผ ๊ฐ์ด 8๊ฐ์ง๊ฐ ์๋ค.
- ์ ์ค์นด๋
- ๋ ๋์นด๋
- ์ค๋ ์ง์นด๋
- ํผํ์นด๋
- ๋ธ๋ฃจ์นด๋
- ์ฒญ๋ก์นด๋
- ๊ทธ๋ฆฐ์นด๋
- ๊ทธ๋ ์ด์นด๋
์นด๋๋ ์นด๋ํฉ์ ํํ๋ก๋ง ๊ตฌ๋งคํ ์ ์๊ณ , ์นด๋ํฉ์ ์ข ๋ฅ๋ ์นด๋ 1๊ฐ๊ฐ ํฌํจ๋ ์นด๋ํฉ, ์นด๋ 2๊ฐ๊ฐ ํฌํจ๋ ์นด๋ํฉ, ... ์นด๋ N๊ฐ๊ฐ ํฌํจ๋ ์นด๋ํฉ๊ณผ ๊ฐ์ด ์ด N๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
๋ฏผ๊ท๋ ์นด๋์ ๊ฐ์๊ฐ ์ ์ ํฉ์ด๋๋ผ๋ ๊ฐ๊ฒฉ์ด ๋น์ธ๋ฉด ๋์ ๋ฑ๊ธ์ ์นด๋๊ฐ ๋ง์ด ๋ค์ด์์ ๊ฒ์ด๋ผ๋ ๋ฏธ์ ์ ๋ฏฟ๊ณ ์๋ค. ๋ฐ๋ผ์, ๋ฏผ๊ท๋ ๋์ ์ต๋ํ ๋ง์ด ์ง๋ถํด์ ์นด๋ N๊ฐ ๊ตฌ๋งคํ๋ ค๊ณ ํ๋ค. ์นด๋๊ฐ i๊ฐ ํฌํจ๋ ์นด๋ํฉ์ ๊ฐ๊ฒฉ์ Pi์์ด๋ค.
์๋ฅผ ๋ค์ด, ์นด๋ํฉ์ด ์ด 4๊ฐ์ง ์ข ๋ฅ๊ฐ ์๊ณ , P1 = 1, P2 = 5, P3 = 6, P4 = 7์ธ ๊ฒฝ์ฐ์ ๋ฏผ๊ท๊ฐ ์นด๋ 4๊ฐ๋ฅผ ๊ฐ๊ธฐ ์ํด ์ง๋ถํด์ผ ํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ 10์์ด๋ค. 2๊ฐ ๋ค์ด์๋ ์นด๋ํฉ์ 2๋ฒ ์ฌ๋ฉด ๋๋ค.
P1 = 5, P2 = 2, P3 = 8, P4 = 10์ธ ๊ฒฝ์ฐ์๋ ์นด๋๊ฐ 1๊ฐ ๋ค์ด์๋ ์นด๋ํฉ์ 4๋ฒ ์ฌ๋ฉด 20์์ด๊ณ , ์ด ๊ฒฝ์ฐ๊ฐ ๋ฏผ๊ท๊ฐ ์ง๋ถํด์ผ ํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ด๋ค.
๋ง์ง๋ง์ผ๋ก, P1 = 3, P2 = 5, P3 = 15, P4 = 16์ธ ๊ฒฝ์ฐ์๋ 3๊ฐ ๋ค์ด์๋ ์นด๋ํฉ๊ณผ 1๊ฐ ๋ค์ด์๋ ์นด๋ํฉ์ ๊ตฌ๋งคํด 18์์ ์ง๋ถํ๋ ๊ฒ์ด ์ต๋๊ฐ์ด๋ค.
์นด๋ ํฉ์ ๊ฐ๊ฒฉ์ด ์ฃผ์ด์ก์ ๋, N๊ฐ์ ์นด๋๋ฅผ ๊ตฌ๋งคํ๊ธฐ ์ํด ๋ฏผ๊ท๊ฐ ์ง๋ถํด์ผ ํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. N๊ฐ๋ณด๋ค ๋ง์ ๊ฐ์์ ์นด๋๋ฅผ ์ฐ ๋ค์, ๋๋จธ์ง ์นด๋๋ฅผ ๋ฒ๋ ค์ N๊ฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ์ฆ, ๊ตฌ๋งคํ ์นด๋ํฉ์ ํฌํจ๋์ด ์๋ ์นด๋ ๊ฐ์์ ํฉ์ N๊ณผ ๊ฐ์์ผ ํ๋ค.
## ์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฏผ๊ท๊ฐ ๊ตฌ๋งคํ๋ ค๊ณ ํ๋ ์นด๋์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 1,000)
๋์งธ ์ค์๋ Pi๊ฐ P1๋ถํฐ PN๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. (1 ≤ Pi ≤ 10,000)
## ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฏผ๊ท๊ฐ ์นด๋ N๊ฐ๋ฅผ ๊ฐ๊ธฐ ์ํด ์ง๋ถํด์ผ ํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋งํ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
1 ์ด | 256 MB | 48155 | 29570 | 22234 | 61.276% |
https://www.acmicpc.net/problem/11052
ํ์ด
์๊ณ ๋ฆฌ์ฆ ํ๋ฆ
์ด๋ฌธ์ ๋ DP๋ก ํธ๋ ๋ฌธ์ ์ด๋ค. ๋ฌธ์ ์์ ์ฃผ์ด์ง ์์๋ก ํ๋ฒ ์ดํดํด๋ณด์.
์นด๋์ ๊ฐ์๋ N๊ฐ์ด๊ณ , N๊ฐ์ ์นด๋๋ฅผ ๊ฐ๊ธฐ์ํด ์ง๋ถํ๋ ๊ธ์ก์ ์ต๋๊ฐ์ dp[n]
์ด๋ผ๊ณ ํด๋ณด์.
(P1=1) (P2=5) (P3=6) (P4=7)
P1์ ๋ป์ 1์ฅ์ด ๋ค์ด์๋ ์นด๋ํฉ(P1)์ ๊ฐ๊ฒฉ์ด 1์ด๋ผ๋ ๋ป์ด๊ณ , ์ด๊ฒ์ ์์๋ก ๋ค์ด๋ณด์.
์นด๋ 1๊ฐ๋ฅผ ๊ฐ๋๋ค๊ณ ํ๋ค๋ฉด, ๊ทธ๊ฒฝ์ฐ๋ P1์ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ ํ๊ฐ์ผ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด,dp[1] = P1
์ด ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์นด๋ 2์ฅ์ ๊ฐ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ผ 2๊ฐ๊ฐ ๋ค์ด์๋ ์นด๋ํฉ์ ๊ตฌ๋งคํ๊ฑฐ๋, 1๊ฐ์ง๋ฆฌ ์นด๋ํฉ์ 2๋ฒ ์ฌ๋ ๊ฒฝ์ฐ์ด๋ค. ์ด๋ ์ง๋ถ๊ธ์ก์ ์ต๋๊ฐ์ด ๋์ผํ๋ฏ๋ก,
dp[2] = Max(P[2], dp[1] + dp[1])
์ด ๋ ๊ฒ์ด๋ค.
๋ค์์ผ๋ก 3์ฅ์ ๊ฐ๋ ๊ฒฝ์ฐ์ ์ง๋ถ๊ธ์ก์ ์ต๋๊ฐ์ ๊ตฌํด๋ณด์.
- 1๊ฐ์ง๋ฆฌ ์นด๋ํฉ 3๊ฐ
- 2๊ฐ์ง๋ฆฌ ์นด๋ํฉ 1๊ฐ, 1๊ฐ์ง๋ฆฌ ์นด๋ํฉ 1๊ฐ
- 3๊ฐ์ง๋ฆฌ ์นด๋ํฉ 1๊ฐ
์ด๋ ๊ฒ 3๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์์ผ๋ก ๋ํ๋ด๋ณด๋ฉด,
dp[3] = Max(P[3], dp[2] + dp[1] , dp[1] x 3)
์ด ๋ ๊ฒ์ด๋ค.
๋ค์์ผ๋ก 4์ฅ์ ๊ฐ๋ ๊ฒฝ์ฐ์ด๋ค.
- 1๊ฐ์ง๋ฆฌ ์นด๋ํฉ 4๊ฐ
- 2๊ฐ์ง๋ฆฌ ์นด๋ํฉ 2๊ฐ
- 3๊ฐ์ง๋ฆฌ ์นด๋ํฉ 1๊ฐ, 1๊ฐ์ง๋ฆฌ ์นด๋ํฉ 1๊ฐ
- 4๊ฐ์ง๋ฆฌ ์นด๋ํฉ 1๊ฐ
์ด๋ ๊ฒ 4๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๋ ๊ฒ์ด๊ณ , ์์ ๋ํ๋ด๋ฉด
dp[4] = Max(P[4], dp[3] + dp[1], dp[2] x 2, dp[1] x 4)
์๋ฅผ ๋ค์ด n = 4์ผ๋,dp[4] =
- ์นด๋ 0๊ฐ๋ฅผ ์ฌ๊ธฐ์ํ ์ต๋ ๊ธ์ก(dp[0]) + 4๊ฐ์ง๋ฆฌ ์นด๋ํฉ ๊ฐ(P4)
- ์นด๋ 1๊ฐ๋ฅผ ์ฌ๊ธฐ์ํ ์ต๋ ๊ธ์ก(dp[1]) + 3๊ฐ์ง๋ฆฌ ์นด๋ํฉ ๊ฐ(P3)
- ์นด๋ 2๊ฐ๋ฅผ ์ฌ๊ธฐ์ํ ์ต๋ ๊ธ์ก(dp[2]) + 2๊ฐ์ง๋ฆฌ ์นด๋ํฉ ๊ฐ(P2)
- ์นด๋ 3๊ฐ๋ฅผ ์ฌ๊ธฐ์ํ ์ต๋ ๊ธ์ก(dp[3]) + 1๊ฐ์ง๋ฆฌ ์นด๋ํฉ ๊ฐ(P1)
์ด๋ฅผ ๋ํ๋ด๋ณด๋ฉด
for(int i=1; i<=n; i++){
for(int j=1; j<=i; j++){
dp[i] = Max(dp[i], dp[i-j] + P[j]);
}
}
ํต์ฌ์ ์ธ ๋ถ๋ถ์ ์์ฑ๋์ผ๋ ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํํด๋ณด์. ๋๋ Scanner + for๋ฌธ(bottom up) ๋ฐฉ์์ผ๋ก ์์ฑํ์๋ค.
์ฝ๋
import java.util.Scanner;
public class ์นด๋๊ตฌ๋งคํ๊ธฐ {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //๊ตฌ๋งคํ๋ ค๋ ์นด๋์ ๊ฐ์
int [] p = new int[n + 1]; //์นด๋๋ง๋ค ๊ฐ๊ฒฉ์ ์ ํ๋ค.
for(int i=1; i<=n; i++){
p[i] = sc.nextInt();
}
int[] dp = new int[n + 1];
for(int i=1; i<=n; i++){
for(int j=1; j<=i; j++){
dp[i] = Math.max(dp[i], dp[i-j] + p[j]);
}
}
System.out.println(dp[n]);
sc.close();
}
}