λ¬Έμ
μ μ 4λ₯Ό 1, 2, 3μ ν©μΌλ‘ λνλ΄λ λ°©λ²μ μ΄ 3κ°μ§κ° μλ€. ν©μ λνλΌ λλ μλ₯Ό 1κ° μ΄μ μ¬μ©ν΄μΌ νλ€. λ¨, κ°μ μλ₯Ό λ λ² μ΄μ μ°μν΄μ μ¬μ©νλ©΄ μ λλ€.
- 1+2+1
- 1+3
- 3+1
μ μ nμ΄ μ£Όμ΄μ‘μ λ, nμ 1, 2, 3μ ν©μΌλ‘ λνλ΄λ λ°©λ²μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
## μ λ ₯
첫째 μ€μ ν μ€νΈ μΌμ΄μ€μ κ°μ Tκ° μ£Όμ΄μ§λ€. κ° ν μ€νΈ μΌμ΄μ€λ ν μ€λ‘ μ΄λ£¨μ΄μ Έ μκ³ , μ μ nμ΄ μ£Όμ΄μ§λ€. nμ μμμ΄λ©° 100,000λ³΄λ€ μκ±°λ κ°λ€.
## μΆλ ₯
κ° ν μ€νΈ μΌμ΄μ€λ§λ€, nμ 1, 2, 3μ ν©μΌλ‘ λνλ΄λ λ°©λ²μ μλ₯Ό 1,000,000,009λ‘ λλ λλ¨Έμ§λ₯Ό μΆλ ₯νλ€.
μκ° μ ν | λ©λͺ¨λ¦¬ μ ν | μ μΆ | μ λ΅ | λ§ν μ¬λ | μ λ΅ λΉμ¨ |
---|---|---|---|---|---|
1 μ΄ (μΆκ° μκ° μμ) | 512 MB | 26395 | 8918 | 6250 | 30.858% |
https://www.acmicpc.net/problem/15990
νμ΄
μκ³ λ¦¬μ¦ νλ¦
μ΄λ¬Έμ λ‘ νμ°Έμ κ³ λ―Όνλ€... dpλ₯Ό μ¬μ©ν΄μ 1μ°¨μ λ°°μ΄μ λ§λ€κ³ μ무리 μκ°μ ν΄λ΄λ μν리λ κ²μ΄λ€. λ΄κ° κ³ λ―Όμ νλ€κ° μνλ Έλ λΆλΆμ΄ λ§μ½ 3μΌ κ²½μ° 1+1+1, 1+2, 3
μ΄λ κ² 3κ°μ§μ κ²½μ°κ° μκΈ°κ³ , μ μΌ λ·μλ¦¬κ° 1μΌλ, 2μΌλ, 3μΌλλ₯Ό ꡬλΆμ§μ΄μ£Όλ λΆλΆμ μ΄λ»κ² ꡬνν μ§ λμ ν κ°μ΄ μμλ€. κ·Έλμ μ°Ύμ보λ... μ€λ§κ° μ§μ§ μ¬λλ€ λλν΄π
μκ·ΈλΌ λ¬Έμ λ₯Ό νμ΄λ³΄μ!
μ΄λ¬Έμ λ μΌλ¨ DPμ 2μ°¨μ λ°°μ΄μ μ¬μ©ν΄μΌνλ€.
DP λ¬Έμ μ΄λ―λ‘ λ¨Όμ 곡ν΅μ μ μ°Ύμ λ΄λκ²μ΄ μ€μνλ€. λ¬Έμ λ₯Ό μμ λ¨μλΆν° μ²μ²ν νμ΄ λ³΄μλ€.
1 > 1
2 > 1+1, 2
3 > 1+1+1, 2+1, 1+2, 3
4 > (1+1+1+1, 2+1+1, 1+2+1, 3+1), (1+1+2, 2+2), (1+3)
μ΄μ λλ©΄ μ΄μ μ΄λμ λ 곡ν΅μ μ΄ λ³΄μ¬μΌνλ€.
- 4λ₯Ό λ§λ€λ, 3μ λ§λλ κ²½μ° +1
- 4λ₯Ό λ§λ€λ, 2λ₯Ό λ§λλ κ²½μ° +2
- 4λ₯Ό λ§λ€λ, 1μ λ§λλ κ²½μ° +3
(μ¬κΈ°μμ 2λ²μ΄μ μ€λ³΅λλ λΆλΆμ μ κ±°νκ³ dpμ κΈ°λ‘νλ©΄ λκ² κ΅¬λ.)
μ΄λ₯Ό λ°νμΌλ‘ dpλ₯Ό λνλ΄λ³΄λ©΄,
dp[i][j] // i: μμμ μ μ, j: λ§μ
μ΄ jλ‘ λλ¨
μ΄λ κ² λ³΄λ©΄ λκ² λ€. κ·ΈλΌ μμλ₯Ό λ€μ΄λ³΄μ.
3μ λ§λλ κ²½μ°
- 1+1+1 =>
dp[3][1] = 1
- 1+2 =>
dp[3][2] = 1
- 2+1 =>
dp[3][1] = 1
- 3 =>
dp[3][3] = 1
5λ₯Ό λ§λλ κ²½μ°
5λ₯Ό λ§λλ κ²½μ°λ₯Ό μμΈνκ² μμ보μ.
5λ₯Ό 1, 2 ,3 μ ν©μΌλ‘ λνλ΄λ³΄μ.
2λ₯Ό λ§λλ κ²½μ°μ 3μ λνκ³ ,
3μ λ§λλ κ²½μ°μ 2λ₯Ό λνκ³ ,
4λ₯Ό λ§λλ κ²½μ°μ 1μ λνλ©΄ 5κ° λ κ²μ΄λ€.
(μ΄λ κ°μ μλ₯Ό 2λ² μ°μμΌλ‘ μ¬μ©ν μλ μλ€. μ¦, μ΄μ μ μ¬μ©ν κ°μ μ κ±°νλ€.)
1) 5λ₯Ό λ§λλ μμμ€μ
1λ‘ λλλ μμ(λ§μ§λ§μ 1μ λν΄μ£Όλ κ²½μ°)μ
4λ₯Ό λ§λλ μμμμ 2λ‘ λλλ κ²μ 1λ₯Ό λνλκ²,
4λ₯Ό λ§λλ μμμ€μμ 3μΌλ‘ λλλ κ²μ 1μ λνλ κ²μ΄λ€.
(κ°μ μ μ°μ 2λ²μ μλκΈ° λλ¬Έμ 1λ‘ λλλ κ²μ μ μΈνλ€.)
μ΄λ₯Ό λνλ΄λ³΄λ©΄ μλμ κ°λ€.
dp[5][1] = dp[4][2] + dp[4][3];
// μ΄κ²μ μΌλ°ν νλ©΄ μλμ κ°λ€.
dp[n][1] = dp[n-1][2] + dp[n-1][3];
2) 2λ₯Ό λνλ κ²½μ°λ₯Ό μ΄ν΄λ³΄μ
λ§μ§λ§μ 2λ₯Ό λν΄μ£Όλ κ²½μ°λ,
3μ λ§λλ μμμμ 1λ‘ λλλ κ²μ 2λ₯Ό λνλκ²,
3μ λ§λλ μμμμ 3μΌλ‘ λλλ κ²μ 2λ₯Ό λνλ κ²μ΄λ€.
(μ΄κ² λν κ°μ μλ₯Ό μ°μμΌλ‘νλ©΄ μλλ―λ‘ 2λ‘ λλλ κ²μ μ μΈ λλ€.)
dp[5][2] = dp[3][1] + dp[3][3];
// μ΄κ²μ μΌλ°ν νλ©΄ μλμ κ°λ€.
dp[n][1] = dp[n-2][1] + dp[n-2][3];
3) 3μ λνλ κ²½μ°λ₯Ό μ΄ν΄λ³΄μ
λ§μ§λ§μ 3μ λν΄μ£Όλ κ²½μ°λ,
2λ₯Ό λ§λλ μμμμ 1λ‘ λλλ κ²μ 3μ λνλκ²,
2λ₯Ό λ§λλ μμμμ 2λ‘ λλλ κ²μ 3μ λνλκ²μ΄λ€.
(μ΄κ²λ κ°μ μλ₯Ό μ°μμΌλ‘ λμ΄ν μμμΌλ―λ‘ 3μΌλ‘ λλλ κ²μ μ κ±°νλ€.)
dp[5][3] = dp[2][1] + dp[2][2];
// μ΄κ²μ μΌλ°ν νλ©΄ μλμ κ°λ€.
dp[n][3] = dp[n-3][1] + dp[n-3][2];
μ΄λ¬ν κ³Όμ μ ν΅ν΄ κ²°κ³Όμ μΌλ‘ μ νμμ λμΆν΄ λΌμμλ€.
dp[i][1] = (dp[i-1][2] + dp[i-1][3]) % 1_000_000_009;
dp[i][2] = (dp[i-2][1] + dp[i-2][3]) % 1_000_000_009;
dp[i][3] = (dp[i-3][1] + dp[i-3][2]) % 1_000_000_009; (n >= 4)
μ νμμμ λͺ¨λλ¬λ₯Ό μ¬μ©νλ μ΄μ
10μ΅9λ‘ λλ μ μΆλ ₯νλΌλ μ ν μ¬νμ΄ μλλ°, λ§μ§λ§μ λͺ¨λλ¬λ₯Ό λ£κ²λλ©΄ κ°μ΄ μ μμ μΌλ‘ μΆλ ₯λμ§μλλ€. κ·Έλ¬λ―λ‘ κ³μ° κ³Όμ μ€κ°μ λͺ¨λλ¬λ₯Ό μ½μ νλ€.
μ½λ
import java.util.Scanner;
public class _123λνκΈ°5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
long[][] dp = new long[100001][4];
dp[1][1] = 1; // 1
dp[2][2] = 1; // 2
dp[3][1] = 1; // 2+1
dp[3][2] = 1; // 1+2
dp[3][3] = 1; // 3
for(int i=4; i<=100000; i++){
dp[i][1] = (dp[i-1][2] + dp[i-1][3]) % 1_000_000_009;
dp[i][2] = (dp[i-2][1] + dp[i-2][3]) % 1_000_000_009;
dp[i][3] = (dp[i-3][1] + dp[i-3][2]) % 1_000_000_009;
}
for(int i=1; i<=t; i++){
int n = sc.nextInt();
System.out.println((dp[n][1] + dp[n][2] + dp[n][3]) % 1_000_000_009);
}
sc.close();
}
}