https://www.acmicpc.net/problem/2156
βοΈ λ¬Έμ
π λ¬Έμ ν΄κ²°
λλν λμ¬μλ ν¬λμ£Όλ₯Ό λ§μ μ κ°μ₯ λ§μ΄ λ§μ μμ μΆλ ₯νλ©΄ λλ λ¬Έμ μ λλ€.
μ΄ λ¬Έμ λ₯Ό 보면μ κ³λ¨μ€λ₯΄κΈ° λ¬Έμ μ μ μ¬νμ¬ ν΄λΉ λ¬Έμ νμ΄ λ°©μλλ‘ νΌλ€λ©΄ νλ¦¬κ² λ©λλ€.
μ΄λ² λ¬Έμ μλ ν¬λμ£Όλ₯Ό λ§μμ§ μλ κ²½μ°λ μμ μ μμΌλ―λ‘, ν΄λΉ κ²½μ°λ μ μκ°ν΄μ€μΌ ν©λλ€.
λ¬Έμ μμ μ£Όμ΄μ§ μμ λ₯Ό μ΄ν΄λ³΄λ©΄, κ°μ₯ λ§μ΄ λ§μ€ μ μλ λ°©λ²μ μλμ κ°μ κ²μ λλ€.
첫 λ²μ§Έ, λ λ²μ§Έ, λ€ λ²μ§Έ, λ€μ― λ²μ§Έλ₯Ό μ ννκ² λλ©΄ 33μ΄ λ©λλ€.
μλμμ μ νν νμ΄λ₯Ό μ€λͺ ν΄λ³΄κ² μ΅λλ€.
1. ν μ΄λΈ μ μ
λ¨Όμ μ°μν΄μ 3μμ λ§μ€ μ μλ μ‘°κ±΄μ΄ μμΌλ―λ‘ 2μ°¨μ λ°°μ΄μ΄ νμν©λλ€.
int[][] dp = new int[N][3];
ν μ΄λΈμ μλμ κ°μ΄ μΈ κ°μ§λ‘ μκ°ν΄λ³Ό μ μμ΅λλ€.
dp[i][0]
μ νμ¬ iλ²μ§Έ ν¬λμ£Όλ₯Ό λ§μμ§ μμ μνλ₯Ό λ»ν©λλ€.dp[i][1]
μ νμ¬ i λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μκ³ , i λ²μ§Έ ν¬λμ£Όλ₯Ό ν¬ν¨ν΄μ μ°μν΄μ 1μ λ§μ ¨λ€λ λ»μ λλ€.dp[i][2]
μ νμ¬ i λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μκ³ , i λ²μ§Έ ν¬λμ£Όλ₯Ό ν¬ν¨ν΄μ μ°μν΄μ 2μ λ§μ ¨λ€λ λ»μ λλ€.
2. μ νμ μ°ΎκΈ°
dp[i][0] λ¨Όμ μκ°ν΄λ³΄κ² μ΅λλ€.
- νμ¬
i
λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μμ§ μμ΅λλ€. - μλ μΈ κ°μ§ κ° μ€ κ°μ₯ ν° κ°μ μ°Ύμμ λ£μ΄μ£Όλλ‘ ν©λλ€.
i-1
λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μκ³ , μ°μν΄μ 1μμ λ§μ κ²½μ° :dp[i-1][1]
i-1
λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μκ³ , μ°μν΄μ 2μμ λ§μ κ²½μ° :dp[i-1][2]
μμΌλ‘ νννλ©΄ μλμ κ°μ΅λλ€.
dp[i][0] = Math.max(dp[i-1][1], dp[i-1][2]);
λ€μμ dp[i][1] μ λν΄ μκ°ν΄λ³΄κ² μ΅λλ€.
- νμ¬
i
λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μ ¨κ³ , νμ¬ ν¬λμ£Όλ₯Ό ν¬ν¨ν΄μ μ°μμΌλ‘ 1μμ λ§μ μνμ λλ€. - κ·Έλ λ€λ©΄
i-1
λ²μ§Έ ν¬λμ£Όλ λ§μμ§ μμλ€λ λ»μ΄ λ©λλ€. - μλ μΈ κ°μ§ κ° μ€ κ°μ₯ ν° κ°μ μ°Ύμμ λ£μ΄μ€λλ€.
- i-2 λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μμ§ μμ κ²½μ° :
dp[i-2][0]
- i-2 λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μκ³ , μ°μν΄μ 1μμ λ§μ κ²½μ° :
dp[i-2][1]
- i-2 λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μκ³ , μ°μν΄μ 2μμ λ§μ κ²½μ° :
dp\[i-2][2]
- i-2 λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μμ§ μμ κ²½μ° :
μμΌλ‘ νννλ©΄ μλμ κ°μ΅λλ€.
// 2λ²μ§Έ μ ν¬λμ£Όλ₯Ό λ§μμ§ μμμ κ²½μ°μ, μ°μν΄μ 1μ λ§μ
¨μ κ²½μ°μ, 2μ λ§μ
¨μ κ²½μ°μ μ΅λκ°μ μ°ΎμΌλ©΄ λ©λλ€.
dp[i][1] = Math.max( Math.max(dp[i-2][0], dp[i-2][1]) , dp[i-2][2] ) + arr[i];
dp[i][2]μ λν΄μλ μλμ κ°μ΅λλ€.
- νμ¬ i λ²μ§Έ ν¬λμ£Όλ₯Ό λ§μ ¨κ³ , νμ¬ ν¬λμ£Όλ₯Ό ν¬ν¨ν΄μ μ°μμΌλ‘ 2μμ λ§μ μνμ λλ€.
- κ·Έλ λ€λ μκΈ°λ,
i-1
λ²μ§Έ ν¬λμ£Όλ₯Ό 무쑰건 λ§μ ¨λ€λ λ»μ΄ λ©λλ€. - νμ§λ§,
i-1
λ²μ§Έλ λ°λμ μ°μν΄μ 1μμ λ§μ μνμ΄μ΄μΌ ν©λλ€. (*μ€μ)
μμΌλ‘ νννλ©΄ μλμ κ°μ΅λλ€.
dp[i][2] = dp[i-1][1] + arr[i];
3. μ΄κΈ°κ° μ€μ
μ΅λ i-2
λ²μ§Έ κΉμ§ νμνκΈ° λλ¬Έμ dp[2]
κΉμ§ κ°μ μ€μ ν΄μ£Όλ©΄ λ©λλ€.
- 1 λ²μ§Έ ν¬λμ£Ό
dp[1][0] = 0;
dp[1][1] = arr[1];
dp[1][2] = 0;
- 2 λ²μ§Έ ν¬λμ£Ό
dp[2][0] = dp[1][1];
dp[2][1] = arr[2];
dp[2][2] = dp[1][1] + arr[2];
π μ 체 μ½λ
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));
int N = Integer.parseInt(bf.readLine());
int[] arr = new int[N+1];
int[][] dp = new int[N+1][3];
for(int i=1; i<=N; i++) {
arr[i] = Integer.parseInt(bf.readLine());
}
// init
int MAX = arr[1];
dp[1][0] = 0;
dp[1][1] = arr[1];
dp[1][2] = 0;
// Nμ΄ 1μΈ κ²½μ°λ₯Ό λλΉν΄ μμΈμ²λ¦¬
if(N >= 2) {
dp[2][0] = dp[1][1];
dp[2][1] = arr[2];
dp[2][2] = dp[1][1] + arr[2];
MAX = dp[2][2];
}
// dp
for(int i=3; i<=N; i++) {
// νμ¬ ν¬λμ£Όλ₯Ό λ§μμ§ μμ κ²½μ°
dp[i][0] = Math.max(dp[i-1][1], dp[i-1][2]);
// νμ¬ ν¬λμ£Όλ₯Ό λ§μκ³ , μ°μμΌλ‘ 1μλ§ λ§μ κ²½μ°
dp[i][1] = Math.max(Math.max(dp[i-2][1], dp[i-2][2]), dp[i-2][0]) + arr[i];
// νμ¬ ν¬λμ£Όλ₯Ό λ§μκ³ , μ§κΈκΉμ§ μ°μν΄μ 2μ λ§μ κ²½μ°
dp[i][2] = dp[i-1][1] + arr[i];
// μ΅λκ°μ λΉκ΅ ν λ£μ΄μ£Όλλ‘ ν©λλ€.
if(MAX < dp[i][0]) MAX = dp[i][0];
if(MAX < dp[i][1]) MAX = dp[i][1];
if(MAX < dp[i][2]) MAX = dp[i][2];
}
System.out.print(MAX);
}
}