๋ด๊ฐ ์งํํ๊ณ ์๋ ์๊ณ ๋ฆฌ์ฆ dp ๋ง์ง๋ง ๋ฌธ์ ์ด๋ค!
์ด์ dp ๋ฌธ์ ๋ ์ฝ๊ฒ ํด๊ฒฐ๋ฒ์ด ๋ ์ค๋ฅด๋ ๊ฒ ๊ฐ๋ค.
์ญ์๋, dp ๋ฐฐ์ด์ ์ด๋ค ๊ฐ์ ๋ฃ์ด์ผ ํ ์ง ๊ณ ๋ฏผํ๊ณ , dp๊ฐ๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋๊ฒ ์ค์ํ๋ค.
dp[i] ์๋ ์ฃผ์ด์ง ์นด๋ํฉ์ ํ์ฉํด์ i์ฅ์ ์ด๋ ์ง๋ถํ๋ ์ต๋ ๊ธ์ก์ ๊ธฐ๋กํ ๊ฒ์ด๋ค.
๋ณดํต, ์์ ๋ฅผ ๋ณด๋ฉด ๊ท์น์ด ์ด๋์ ๋ ๋ณด์ธ๋ค.
๋ฌธ์ ์์ ์ฒ๋ผ, 4์ฅ์ ๋ฝ์์ผ ๋๋ ์ํฉ์์
์นด๋ ํฉ ๋ฐฐ์ด์ cp ๋ผ๊ณ ํ์ ๋
1์ฅ ์นด๋ ํฉ = 3์ = cp[1]
2์ฅ ์นด๋ ํฉ = 5์ = cp[2]
3์ฅ ์นด๋ ํฉ = 15์ = cp[3]
4์ฅ ์นด๋ ํฉ = 16์ = cp[4]
์ ์๊ฐํด๋ณด์.
dp[1] ์ 1์ฅ ์นด๋ํฉ์ ์ฌ๋ ๊ฒฝ์ฐ ๋ฐ์ ์์ผ๋ฏ๋ก dp[1] = cp[1] = 3์์ด๋ค.
dp[2] ๋ 2์ฅ์ ๊ตฌ๋งคํด์ผํ๋๋ฐ,
1์ฅ ์นด๋ํฉ์ 2๊ฐ ์ฌ๋ ๊ฒฝ์ฐ์ 2์ฅ ์นด๋ํฉ์ 1๊ฐ ์ฌ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ฆ, cp[2] ์ cp[1] + cp[1] ์ค ๋ ํฐ๊ฐ์ผ๋ก ์ ํด์ผ ํ๋๋ฐ
cp[2] = 5 > cp[1] + cp[1] = 6 ์ด๋ฏ๋ก
dp[2] = 6์ด ๋๋ค.
dp[3]์ 3์ฅ ์นด๋ํฉ์ 1๊ฐ ์ฌ๋ ๊ฒฝ์ฐ์
2์ฅ ์นด๋ํฉ 1๊ฐ์ 1์ฅ ์นด๋ํฉ 1๊ฐ๋ฅผ ์ฌ๋ ๊ฒฝ์ฐ์
1์ฅ ์นด๋ํฉ 3๊ฐ๋ฅผ ์ฌ๋ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ด๋ค.
cp[3] ๊ณผ cp[2]+cp[1] ๊ณผ cp[1]+cp[1]+cp[1] ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ด ๊ธฐ๋ก๋ ๊ฒ์ด๋ค.
cp[2]+cp[1] ๊ณผ cp[1]+cp[1]+cp[1]์ ๋์๊ด๊ณ๋
dp[2] = max(cp[2] , cp[1] + cp[1]) ์ด๋ฏ๋ก dp[2] ๊ฐ ๊ฒฐ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์
dp[2]+dp[1] ํ๋์ ํญ์ผ๋ก ๋น๊ตํด๋ ์ฑ๋ฆฝํ๋ค.
์ฆ cp[3]๊ณผ dp[2]+dp[1] ์ค ํฐ ๊ฐ์ dp[3]์ ๊ธฐ๋กํ๋ฉด๋๋ค.
์ด์ ์ผ๋ฐํ๋ฅผ ์์ผ๋ณด๋ฉด
dp[n] = cp[n] vs dp[n-1] + dp[1] vs dp[n-2] + dp[2] vs ······· vs dp[1] + dp[n-1] ์ค ๊ฐ์ฅ ํฐ๊ฐ์ ๊ธฐ๋กํ๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก,,
dp[1] + dp[n-1] == dp[n-1] + dp[1] ์ด๋ฏ๋ก
dp[n] = Max(cp[n] , dp[n-1] +dp[1] , dp[n-2]+dp[2], ·····,dp[n/2] + dp[2/n] ) ๋ก ๋น๊ตํ๋ ํญ์ ๊ฐฏ์๋ฅผ ์ค์ผ ์ ์๋ค. (์ค์ด์ง ์์๋ ์ ๋ต ์ฒ๋ฆฌ๋ ๋๋ค.)
์๋ฌดํผ ์์ ๊ฐ์ ์๋ฆฌ๋ฅผ ์ ์ฉํด์ ์ฝ๋ฉํ๋ฉด ๋๋ค!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.valueOf(br.readLine());
int [] dp = new int[N+1];
String [] input = br.readLine().split(" ");
int [] cardPack = new int [N+1];
for(int i=0;i<N;i++) {
cardPack[i+1] = Integer.valueOf(input[i]);
}
// System.out.println(Arrays.toString(cardPack));
for(int i=1;i<=N;i++) {
dp[i]=cardPack[i];
// for(int j =1;j<=i-1;j++) { // ์ด๋ ๊ฒ ํด๋ ์ ๋ต ์ฒ๋ฆฌ๋ ๋๋ค.
for(int j =1;j<=i/2;j++) {
dp[i]=Math.max(dp[i], dp[j]+dp[i-j]);
}
}
// System.out.println(Arrays.toString(dp));
System.out.println(dp[N]);
}
}
๋๋์ด DP๊ฐ ๋๋ฌ๋ค. ๋ด์ผ๋ถํฐ๋ ์ ๋ ฌ ๋ฌธ์ ๋ฅผ ํ์ด๋ด์ผ ๊ฒ ๋ค.