https://www.acmicpc.net/problem/2579
βοΈ λ¬Έμ
π λ¬Έμ ν΄κ²°
λ¬Έμ μ 쑰건μ ν΄μν΄λ³΄λ©΄ μλμ κ°μ΅λλ€.
- κ³λ¨μ νλ²μ νμΉΈ λλ λμΉΈμ μ€λ₯Ό μ μμ΅λλ€.
- μ°μλ μΈ κ°μ κ³λ¨μ λ°μμλ μλ©λλ€.
- 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]));
}
}