λ°μν
10844λ²: μ¬μ΄ κ³λ¨ μ (acmicpc.net)
βοΈ λ¬Έμ
π λ¬Έμ ν΄κ²°
1. ν μ΄λΈ μ μ
dp[i][j]
λ κΈΈμ΄κ° iμ΄κ³ , jλ‘ μμνλ μλ€ μ€ κ³λ¨ μμ κ°μλ₯Ό λ»ν©λλ€.
μ€λͺ μ΄ λΆμ‘±ν λ― ν΄λ³΄μ¬ μλμ ν ννλ‘ ννν΄λ³΄μμ΅λλ€.
- 0μΌλ‘ μμνλ μλ μλ€κ³ 쑰건μ λμμμ§λ§, μ νμμ μΈμ°κΈ° μν΄μλ 0μΌλ‘ μμνλ κ³λ¨ μλ νμν©λλ€.
- dp[i][j]μλ μ νμμ μ μν λλ‘ κ°μκ° λ€μ΄κ° κ²μ λλ€. μ¬κΈ°μ μ€μν ν¬μΈνΈλ dp[1][0] = 0μ΄λΌκ³ ν΄μ κ°μκ° 0μ΄ μλλλ€! 1κ°λ‘ 체ν¬ν΄μ€μΌ μλ μ νμμ΄ μ±λ¦½ν©λλ€.
2. μ νμ μΈμ°κΈ°
μ νλ₯Ό μ°Έκ³ νλ©΄μ μ νμμ μΈμ°λ©΄ μλμ κ°μ΅λλ€. (λ¨, iλ 2λΆν° μμν©λλ€.)
- κΈΈμ΄κ° iμΌ λ, 0μΌλ‘ μμνλ μλ
dp[i][0]
μdp[i-1][1]
κ°κ³Ό λμΌν©λλ€. (dp[i][j]λ κ°μμ λλ€.) - κΈΈμ΄κ° iμ΄κ³ jλ‘ μμνλ μ μΌλ,
dp[i][j]
λdp[i-1][j-1] + dp[i-1][j+1]
κ³Ό λμΌν©λλ€. - λ¨, κΈΈμ΄κ° iμ΄κ³ 9λ‘ μμνλ μλ dp[i-1][8]κ³Ό λμΌν©λλ€.
μ 쑰건μ μ½λλ‘ λνλ΄λ©΄ μλμ κ°μ΅λλ€.
for(int i = 2; i <= N; i++) {
// 0μΌλ‘ μμνλ κ³λ¨ μμ κ°μλ κΈΈμ΄κ° i-1μ΄κ³ 1λ‘ μμνλ κ³λ¨ μμ κ°μμ λμΌν©λλ€.
dp[i][0] = dp[i-1][1];
// j(1 ~ 8)λ‘ μμνλ κ³λ¨ μλ i-1κΈΈμ΄μ j-1λ‘ μμνλ κ³λ¨ μμ j+1λ‘ μμνλ κ³λ¨μμ κ°μμ ν©κ³Ό λμΌν©λλ€.
for(int j=1; j<=8; j++) {
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1];
}
// 9λ‘ μμνλ κ³λ¨ μλ i-1κΈΈμ΄μ 8λ‘ μμνλ κ³λ¨ μμ κ°μμ κ°μ΅λλ€.
dp[i][9] = dp[i-1][8];
}
3. μ΄κΈ°κ° μ€μ
μ΄κΈ°κ°μΌλ‘λ κΈΈμ΄κ° 1μΌ λμ κ³λ¨ μμ κ°μλ§ μ€μ ν΄μ£Όλ©΄ λ©λλ€.
μ£Όμν΄μΌ ν μ μ, intν λ²μλ₯Ό λμ μ μκΈ° λλ¬Έμ long λ°°μ΄μ μ¬μ©ν©λλ€.
for(int i=0; i<=9; i++) {
dp[1][i] = 1L;
}
π μ 체 μ½λ
import java.io.*;
import java.util.*;
public class Main {
static int N;
static final long MOD = 1_000_000_000L;
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(bf.readLine());
long[][] dp = new long[N+1][10];
// init
for(int i=0; i<=9; i++) {
dp[1][i] = 1L;
}
for(int i=2; i<=N; i++) {
// 0μΌλ‘ μμνλ μμ κ°μ
dp[i][0] = dp[i-1][1];
for(int j=1; j<=9; j++) {
// 9μΌκ²½μ°λ μ΄μ μλ¦Ώμμ 8λ‘ μμνλ μμ κ°μμ λμΌνλ€!
if(j == 9) dp[i][9] = dp[i-1][8] % MOD;
// λλ¨Έμ§ μλ€μ μ΄μ μ«μμ j-1λ‘ μμνλ μμ κ°μμ j+1λ‘ μμνλ μμ κ°μλ₯Ό λν κ°μ΄λ€.
else dp[i][j] = (dp[i-1][j-1] % MOD + dp[i-1][j+1] % MOD) % MOD;
}
}
long result = 0;
for(int i=1; i<=9; i++) {
result = (result + dp[N][i]) % MOD; // μ λ΅μ λνλ©΄μ μ€λ²νλ‘μ°κ° λ°μν μ μμΌλ―λ‘ μ£Όμ!
}
System.out.print(result);
}
}
κ°μ¬ν©λλ€!
λ°μν