https://www.acmicpc.net/problem/2579
2579๋ฒ: ๊ณ๋จ ์ค๋ฅด๊ธฐ
๊ณ๋จ ์ค๋ฅด๊ธฐ ๊ฒ์์ ๊ณ๋จ ์๋ ์์์ ๋ถํฐ ๊ณ๋จ ๊ผญ๋๊ธฐ์ ์์นํ ๋์ฐฉ์ ๊น์ง ๊ฐ๋ ๊ฒ์์ด๋ค. <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ๊ฐ๊ฐ์ ๊ณ๋จ์๋ ์ผ์ ํ ์ ์๊ฐ ์ฐ์ฌ ์๋๋ฐ ๊ณ๋จ์ ๋ฐ์ผ๋ฉด ๊ทธ ๊ณ๋จ์ ์ฐ์ฌ ์๋ ์
www.acmicpc.net
โ๏ธ ๋ฌธ์

๐ ๋ฌธ์ ํด๊ฒฐ
๋ฌธ์ ์ ์กฐ๊ฑด์ ํด์ํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- ๊ณ๋จ์ ํ๋ฒ์ ํ์นธ ๋๋ ๋์นธ์ ์ค๋ฅผ ์ ์์ต๋๋ค.
- ์ฐ์๋ ์ธ ๊ฐ์ ๊ณ๋จ์ ๋ฐ์์๋ ์๋ฉ๋๋ค.
- 1 ์นธ์ฉ ์ธ๋ฒ ์ฐ์ ์ค๋ฅด๋ฉด ์๋๋ค๋ ๋ป!
- ๋ง์ง๋ง ์นธ์ ๋ฌด์กฐ๊ฑด ๋ฐ์์ผ ํฉ๋๋ค.
1. ํ ์ด๋ธ ์ ์ํ๊ธฐ
dp[i][j]
์ i๋ i ๋ฒ์งธ ๊ณ๋จ์ ์ฌ๋์ ๋์ ์ต๋ ์ ์์ ํฉ์ด ๋๊ณ , j๋ ํ์ฌ๊น์ง ๋ช๋ฒ์ ์ฐ์ํด์ ๊ณ๋จ์ ๋ฐ๊ณ ์๋์ง๋ฅผ ๋ปํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, j๋ 3๋ฒ ์ฐ์ ์ค๋ฅด๋ฉด ์๋๊ธฐ ๋๋ฌธ์ j์ ๊ฐ์ 1
๋๋ 2
๊ฐ ๋ฉ๋๋ค.
2. ์ ํ์ ์ธ์ฐ๊ธฐ
dp[i][j]
์ ์ ํ์์ ์ธ์ฐ๊ธฐ ์ ์ ์๋ฅผ ๋ค์ด 4 ์นธ์ธ ๊ณ๋จ์ ์๋ฅผ ๋ค์ด์ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
4 ์นธ์ธ ๊ณ๋จ์ ๋ฐ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ 4 ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- 1์นธ -> 1์นธ -> 2์นธ ์ด๋

- 1์นธ -> 2์นธ -> 1์นธ ์ด๋

- 2์นธ -> 1์นธ -> 1์นธ ์ด๋ (3 ๊ณ๋จ ์ฐ์ํด์ ๋ฐ์์ ์ ์ธ)

- 2์นธ -> 2์นธ ์ด๋

๋ง์ง๋ง 4 ๋ฒ์งธ ๊ณ๋จ์ ์ฌ๋์ ๋์ 1๊ฐ์ ์ฐ์๋ ๊ณ๋จ์ ๋ฐ์์ ๊ฒฝ์ฐ์ 2๊ฐ์ ์ฐ์๋ ๊ณ๋จ์ ๋ฐ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ๋ณผ ์ ์๋ค.
dp[4][1]
: 1๊ฐ์ ์ฐ์๋ ๊ณ๋จ์ ๋ฐ๊ณ ์์ ๊ฒฝ์ฐ- 1์นธ, 1์นธ, 2์นธ ์ด๋ํ ๊ฒฝ์ฐ
- 2์นธ, 2์นธ ์ด๋ํ ๊ฒฝ์ฐ
dp[4][1] = Math.max(dp[2][2], dp[2][1]) + scores[4];
dp[4][2]
: 2๊ฐ์ ์ฐ์๋ ๊ณ๋จ์ ๋ฐ๊ณ ์์ ๊ฒฝ์ฐ- 1์นธ, 2์นธ, 1์นธ ์ด๋ํ ๊ฒฝ์ฐ
// dp[3][2]์ ๊ฐ์ ๋น๊ตํ์ง ์์ ์ด์ ๋, 3 ๋ฒ์งธ ๊ณ๋จ์์ ์ด๋ฏธ 2๊ฐ์ ๊ณ๋จ์ ์ฐ์์ผ๋ก ๋ฐ๊ณ ์๋ค๋ฉด? 4 ๋ฒ์งธ ๊ณ๋จ์ ๋ฐ๋๋ค๋ฉด 3๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ๋ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ์ด๊ธ๋๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด 1๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ๋ฐ์ ์ํ์ฌ์ผ ํฉ๋๋ค.
dp[4][2] = dp[3][1] + scores[4];
์ด๊ธฐ๊ฐ ์ค์
์์ ์ ํ์์ ์ธ์ธ ๋ ๋ดค๋ ๊ทธ๋ฆผ์ ์ด์ฉํด์ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๋ค๋ฉด, ์๋์ ๊ฐ์ต๋๋ค.
// 1๋ฒ์งธ ๊ณ๋จ์ 1๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ์ฌ๋ผ ๊ฐ ์ ์์ต๋๋ค. ํ์ง๋ง, 1๋ฒ์งธ ๊ณ๋จ์ด๊ธฐ ๋๋ฌธ์ 2๊ฐ์ ์ฐ์ํด์ ๊ณ๋จ์ ์ฌ๋ผ์ฌ ์๋ ์์ต๋๋ค.
dp[1][1] = 1;
dp[1][2] = 0;
// 2๋ฒ์งธ ๊ณ๋จ์ 1๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ์ฌ๋ผ ๊ฐ ์ ์์ต๋๋ค. 2๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ์ค๋ฅธ๋ค๋ฉด, ์ด์ ์ ๊ณ๋จ์ ๋ฐ์๋ค๋ ๋ป์ด๋ฏ๋ก ์ ์๋ฅผ ๋ํด์ค๋๋ค.(ํ์ง๋ง ์ด์ ๊ณ๋จ์ ๋ฐ๋์ 1๊ฐ์ ๊ณ๋จ์ ๋ฐ์ ์ํ์ด์ฌ์ผ ํฉ๋๋ค.)
if(N >=2) {
dp[2][1] = scores[2];
dp[2][2] = dp[1][1] + scores[2];
} // ๊ณ๋จ์ ๋์ด๊ฐ 1์ผ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค๋๋ค.
๐ ์ ์ฒด ์ฝ๋
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
int[] score = new int[N+1];
for(int i=1; i<=N; i++){
score[i] = Integer.parseInt(bf.readLine());
}
// dp[i][1]๋ i๋ฒ์งธ ๊ณ๋จ์ 1๊ณ๋จ ์ฐ์์ผ๋ก ์ฌ๋ผ์๋ค๋ ๋ป์
๋๋ค. -> i-1์ ๋ฐ์ง ์์๋ค๋ ๋ป!
// dp[i][2]๋ i๋ฒ์งธ ๊ณ๋จ์ 2๊ณ๋จ ์ฐ์์ผ๋ก ์ฌ๋ผ์๋ค๋ ๋ป์
๋๋ค. -> i-1๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฐ์๋ค๋ ๋ป!
int[][] dp = new int[N+1][3];
// ์ด๊ธฐ๊ฐ ์ธํ
dp[1][1] = score[1];
// 1์ด ์
๋ ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ์์ธ์ฒ๋ฆฌ
if(N >= 2) {
dp[2][1] = score[2];
dp[2][2] = score[1] + score[2];
}
// i๋ฒ์งธ ๊ณ๋จ์ 1์ฐ์์ผ๋ก ๋ฐ์๋ค๋ ๊ฒ์, i-2๊ณ๋จ์ 1์ฐ์์ผ๋ก ๋ฐ๊ณ ์ฌ๋ผ์จ ์ ์(dp[i-2][1])์, 2์ฐ์์ผ๋ก ๋ฐ๊ณ ์ฌ๋ผ์จ ์ ์(dp[i-2][2])์ค ๊ฐ์ฅ ํฐ ์ ์๋ฅผ ์ ํํ๋ฉด ๋ฉ๋๋ค.
// i๋ฒ์งธ ๊ณ๋จ์ 2์ฐ์์ผ๋ก ๋ฐ์๋ค๋ ๊ฒ์, i-1๊ณ๋จ์ ๋ฌด์กฐ๊ฑด ๋ฐ๊ณ ์์ด์ผ ํ๋๋ฐ, i-1๊ณ๋จ์ ๋ฐ์์ ๋น์์๋ 1์ฐ์์ผ๋ก ๋ฐ๊ณ ์จ ์ํ์ฌ์ผ ํฉ๋๋ค!
for(int i=3; i <= N; i++) {
dp[i][1] = Math.max(dp[i-2][1], dp[i-2][2]) + score[i];
dp[i][2] = dp[i-1][1] + score[i];
}
System.out.print(Math.max(dp[N][1], dp[N][2]));
}
}
https://www.acmicpc.net/problem/2579
2579๋ฒ: ๊ณ๋จ ์ค๋ฅด๊ธฐ
๊ณ๋จ ์ค๋ฅด๊ธฐ ๊ฒ์์ ๊ณ๋จ ์๋ ์์์ ๋ถํฐ ๊ณ๋จ ๊ผญ๋๊ธฐ์ ์์นํ ๋์ฐฉ์ ๊น์ง ๊ฐ๋ ๊ฒ์์ด๋ค. <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ๊ฐ๊ฐ์ ๊ณ๋จ์๋ ์ผ์ ํ ์ ์๊ฐ ์ฐ์ฌ ์๋๋ฐ ๊ณ๋จ์ ๋ฐ์ผ๋ฉด ๊ทธ ๊ณ๋จ์ ์ฐ์ฌ ์๋ ์
www.acmicpc.net
โ๏ธ ๋ฌธ์

๐ ๋ฌธ์ ํด๊ฒฐ
๋ฌธ์ ์ ์กฐ๊ฑด์ ํด์ํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- ๊ณ๋จ์ ํ๋ฒ์ ํ์นธ ๋๋ ๋์นธ์ ์ค๋ฅผ ์ ์์ต๋๋ค.
- ์ฐ์๋ ์ธ ๊ฐ์ ๊ณ๋จ์ ๋ฐ์์๋ ์๋ฉ๋๋ค.
- 1 ์นธ์ฉ ์ธ๋ฒ ์ฐ์ ์ค๋ฅด๋ฉด ์๋๋ค๋ ๋ป!
- ๋ง์ง๋ง ์นธ์ ๋ฌด์กฐ๊ฑด ๋ฐ์์ผ ํฉ๋๋ค.
1. ํ ์ด๋ธ ์ ์ํ๊ธฐ
dp[i][j]
์ i๋ i ๋ฒ์งธ ๊ณ๋จ์ ์ฌ๋์ ๋์ ์ต๋ ์ ์์ ํฉ์ด ๋๊ณ , j๋ ํ์ฌ๊น์ง ๋ช๋ฒ์ ์ฐ์ํด์ ๊ณ๋จ์ ๋ฐ๊ณ ์๋์ง๋ฅผ ๋ปํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, j๋ 3๋ฒ ์ฐ์ ์ค๋ฅด๋ฉด ์๋๊ธฐ ๋๋ฌธ์ j์ ๊ฐ์ 1
๋๋ 2
๊ฐ ๋ฉ๋๋ค.
2. ์ ํ์ ์ธ์ฐ๊ธฐ
dp[i][j]
์ ์ ํ์์ ์ธ์ฐ๊ธฐ ์ ์ ์๋ฅผ ๋ค์ด 4 ์นธ์ธ ๊ณ๋จ์ ์๋ฅผ ๋ค์ด์ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
4 ์นธ์ธ ๊ณ๋จ์ ๋ฐ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ 4 ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- 1์นธ -> 1์นธ -> 2์นธ ์ด๋

- 1์นธ -> 2์นธ -> 1์นธ ์ด๋

- 2์นธ -> 1์นธ -> 1์นธ ์ด๋ (3 ๊ณ๋จ ์ฐ์ํด์ ๋ฐ์์ ์ ์ธ)

- 2์นธ -> 2์นธ ์ด๋

๋ง์ง๋ง 4 ๋ฒ์งธ ๊ณ๋จ์ ์ฌ๋์ ๋์ 1๊ฐ์ ์ฐ์๋ ๊ณ๋จ์ ๋ฐ์์ ๊ฒฝ์ฐ์ 2๊ฐ์ ์ฐ์๋ ๊ณ๋จ์ ๋ฐ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ๋ณผ ์ ์๋ค.
dp[4][1]
: 1๊ฐ์ ์ฐ์๋ ๊ณ๋จ์ ๋ฐ๊ณ ์์ ๊ฒฝ์ฐ- 1์นธ, 1์นธ, 2์นธ ์ด๋ํ ๊ฒฝ์ฐ
- 2์นธ, 2์นธ ์ด๋ํ ๊ฒฝ์ฐ
dp[4][1] = Math.max(dp[2][2], dp[2][1]) + scores[4];
dp[4][2]
: 2๊ฐ์ ์ฐ์๋ ๊ณ๋จ์ ๋ฐ๊ณ ์์ ๊ฒฝ์ฐ- 1์นธ, 2์นธ, 1์นธ ์ด๋ํ ๊ฒฝ์ฐ
// dp[3][2]์ ๊ฐ์ ๋น๊ตํ์ง ์์ ์ด์ ๋, 3 ๋ฒ์งธ ๊ณ๋จ์์ ์ด๋ฏธ 2๊ฐ์ ๊ณ๋จ์ ์ฐ์์ผ๋ก ๋ฐ๊ณ ์๋ค๋ฉด? 4 ๋ฒ์งธ ๊ณ๋จ์ ๋ฐ๋๋ค๋ฉด 3๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ๋ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ์ด๊ธ๋๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด 1๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ๋ฐ์ ์ํ์ฌ์ผ ํฉ๋๋ค.
dp[4][2] = dp[3][1] + scores[4];
์ด๊ธฐ๊ฐ ์ค์
์์ ์ ํ์์ ์ธ์ธ ๋ ๋ดค๋ ๊ทธ๋ฆผ์ ์ด์ฉํด์ ์ด๊ธฐ๊ฐ์ ์ค์ ํ๋ค๋ฉด, ์๋์ ๊ฐ์ต๋๋ค.
// 1๋ฒ์งธ ๊ณ๋จ์ 1๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ์ฌ๋ผ ๊ฐ ์ ์์ต๋๋ค. ํ์ง๋ง, 1๋ฒ์งธ ๊ณ๋จ์ด๊ธฐ ๋๋ฌธ์ 2๊ฐ์ ์ฐ์ํด์ ๊ณ๋จ์ ์ฌ๋ผ์ฌ ์๋ ์์ต๋๋ค.
dp[1][1] = 1;
dp[1][2] = 0;
// 2๋ฒ์งธ ๊ณ๋จ์ 1๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ์ฌ๋ผ ๊ฐ ์ ์์ต๋๋ค. 2๊ฐ์ ๊ณ๋จ์ ์ฐ์ํด์ ์ค๋ฅธ๋ค๋ฉด, ์ด์ ์ ๊ณ๋จ์ ๋ฐ์๋ค๋ ๋ป์ด๋ฏ๋ก ์ ์๋ฅผ ๋ํด์ค๋๋ค.(ํ์ง๋ง ์ด์ ๊ณ๋จ์ ๋ฐ๋์ 1๊ฐ์ ๊ณ๋จ์ ๋ฐ์ ์ํ์ด์ฌ์ผ ํฉ๋๋ค.)
if(N >=2) {
dp[2][1] = scores[2];
dp[2][2] = dp[1][1] + scores[2];
} // ๊ณ๋จ์ ๋์ด๊ฐ 1์ผ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค๋๋ค.
๐ ์ ์ฒด ์ฝ๋
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
int[] score = new int[N+1];
for(int i=1; i<=N; i++){
score[i] = Integer.parseInt(bf.readLine());
}
// dp[i][1]๋ i๋ฒ์งธ ๊ณ๋จ์ 1๊ณ๋จ ์ฐ์์ผ๋ก ์ฌ๋ผ์๋ค๋ ๋ป์
๋๋ค. -> i-1์ ๋ฐ์ง ์์๋ค๋ ๋ป!
// dp[i][2]๋ i๋ฒ์งธ ๊ณ๋จ์ 2๊ณ๋จ ์ฐ์์ผ๋ก ์ฌ๋ผ์๋ค๋ ๋ป์
๋๋ค. -> i-1๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฐ์๋ค๋ ๋ป!
int[][] dp = new int[N+1][3];
// ์ด๊ธฐ๊ฐ ์ธํ
dp[1][1] = score[1];
// 1์ด ์
๋ ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ์์ธ์ฒ๋ฆฌ
if(N >= 2) {
dp[2][1] = score[2];
dp[2][2] = score[1] + score[2];
}
// i๋ฒ์งธ ๊ณ๋จ์ 1์ฐ์์ผ๋ก ๋ฐ์๋ค๋ ๊ฒ์, i-2๊ณ๋จ์ 1์ฐ์์ผ๋ก ๋ฐ๊ณ ์ฌ๋ผ์จ ์ ์(dp[i-2][1])์, 2์ฐ์์ผ๋ก ๋ฐ๊ณ ์ฌ๋ผ์จ ์ ์(dp[i-2][2])์ค ๊ฐ์ฅ ํฐ ์ ์๋ฅผ ์ ํํ๋ฉด ๋ฉ๋๋ค.
// i๋ฒ์งธ ๊ณ๋จ์ 2์ฐ์์ผ๋ก ๋ฐ์๋ค๋ ๊ฒ์, i-1๊ณ๋จ์ ๋ฌด์กฐ๊ฑด ๋ฐ๊ณ ์์ด์ผ ํ๋๋ฐ, i-1๊ณ๋จ์ ๋ฐ์์ ๋น์์๋ 1์ฐ์์ผ๋ก ๋ฐ๊ณ ์จ ์ํ์ฌ์ผ ํฉ๋๋ค!
for(int i=3; i <= N; i++) {
dp[i][1] = Math.max(dp[i-2][1], dp[i-2][2]) + score[i];
dp[i][2] = dp[i-1][1] + score[i];
}
System.out.print(Math.max(dp[N][1], dp[N][2]));
}
}