๋ฌธ์
45656์ด๋ ์๋ฅผ ๋ณด์.
์ด ์๋ ์ธ์ ํ ๋ชจ๋ ์๋ฆฌ์ ์ฐจ์ด๊ฐ 1์ด๋ค. ์ด๋ฐ ์๋ฅผ ๊ณ๋จ ์๋ผ๊ณ ํ๋ค.
N์ด ์ฃผ์ด์ง ๋, ๊ธธ์ด๊ฐ N์ธ ๊ณ๋จ ์๊ฐ ์ด ๋ช ๊ฐ ์๋์ง ๊ตฌํด๋ณด์. 0์ผ๋ก ์์ํ๋ ์๋ ๊ณ๋จ์๊ฐ ์๋๋ค.
## ์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. N์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
## ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ต์ 1,000,000,000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋งํ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
1 ์ด | 256 MB | 136447 | 43731 | 31781 | 30.389% |
https://www.acmicpc.net/problem/10844
ํ์ด
์๊ณ ๋ฆฌ์ฆ ํ๋ฆ
์๋ฆฌ์๊ฐ 100, ์ฆ, 100์งธ ์๋ฆฌ ์๊น์ง ์ฃผ์ด์ง๋ ๋ฌธ์ ์ด๋ long
ํ์
์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ด์ผํ๋ค. ์ด๋ฌธ์ ์์ ๊ฐ์ฅ ํฌ์ธํธ๋ ์ธ์ ํ ๋ชจ๋ ์๊ฐ 1์ฉ ์ฐจ์ด๋๋ค ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
1) N๋ฒ์งธ ์๋ฆฌ์์ ์๋ฆฟ๊ฐ์ด 0์ธ๊ฒฝ์ฐ : ๋ค์ ์๋ฆฌ์๋ 1๋ง ๊ฐ๋ฅํ๋ค.
2) N๋ฒ์งธ ์๋ฆฌ์์ ์๋ฆฟ๊ฐ์ด 9์ธ๊ฒฝ์ฐ : ๋ค์ ์๋ฆฌ์๋ 8๋ง ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด, 10X ๋ผ๊ณ ํ ๋ X์ ๋ค์ด๊ฐ์์๋๊ฐ์ 1๋ฟ (101)์ด๊ณ , 19X๋ผ๊ณ ํ๋ค๋ฉด X์ ๋ค์ด๊ฐ์์๋๊ฐ์ 8๋ฟ(198) ์ธ ๊ฒ์ด๋ค. 0๊ณผ 9์ด์ธ์ 1~8๊น์ง๋ ์๋ค๋ก +1, -1์ ๊ฐ์ง์์๋ค.
์ด๋ฌ๋ฉด ์๋ฆฟ๊ฐ์ 0~9๋ฅผ ๊ฐ์ง์ ์๊ณ , N๊ฐ์ ์๋ฆฟ๊ฐ์ ํํํด์ผํ๋ฏ๋ก 2์ฐจ์๋ฐฐ์ด์ด ํ์ํ๋ค.
Long[][] dp = new Long[n+1][10]; // dp [n์๋ฆฌ์][์๋ฆฟ๊ฐ]
์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ฌธ์ ์ ์ ์ฉํ์ฌ ๋ณด์. ์ ํ์์ ๊ทธ๋๋ก ์ ์ฉํ์ฌ, ์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ๊ฒ์ด๋ค. ์ฌ๊ท๋ฅผ ์ํด ์๋ฆฟ์์ ํํํ digit
, ์๋ฆฟ๊ฐ์ ํํํ val
๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
*
digit ๋ ์๋ฆฟ์, val์ ์๋ฆฟ๊ฐ์ ์๋ฏธํจ
์ฒซ์งธ ์๋ฆฌ์๋ ๊ฐ val์ด ๋์ด๊ธฐ ๋๋ฌธ์
๊ฒฝ์ฐ์ ์๋ 1๋ฐ์ ์๋ค. ์ฆ, dp[1]์ ๊ฐ ์๋ฆฟ๊ฐ์
1๋ก ์ด๊ธฐํ ๋์ด์์ด์ผํ๋ค.
*/
static long recur(int digit, int val) {
// ์ฒซ์งธ ์๋ฆฌ์์ ๋์ฐฉํ๋ค๋ฉด ๋์ด์ ํ์ํ ํ์ ์์
if(digit == 1) {
return dp[digit][val];
}
// ํด๋น ์๋ฆฌ์์ val๊ฐ์ ๋ํด ํ์ํ์ง ์์์ ๊ฒฝ์ฐ
if(dp[digit][val] == null) {
// val์ด 0์ผ๊ฒฝ์ฐ ์ด์ ์๋ฆฌ๋ 1๋ฐ์ ๋ชป์ด
if(val == 0) {
dp[digit][val] = recur(digit - 1 ,1);
}
// val์ด 9์ผ๊ฒฝ์ฐ ์ด์ ์ 8๋ฐ์ ๋ชป์ด
else if(val== 9) {
dp[digit][val] = recur(digit - 1, 8);
}
// ๊ทธ ์ธ์ ๊ฒฝ์ฐ๋ val-1๊ณผ val+1 ๊ฐ์ ๊ฒฝ์ฐ์ ์๋ฅผ ํฉํ ๊ฒฝ์ฐ์ ์๊ฐ ๋จ
else {
dp[digit][val] = recur(digit - 1, val - 1) + recur(digit - 1, val + 1);
}
}
return dp[digit][val];
}
์ฝ๋
package ๊ธฐ์ด1.Day15.์ ํด์;
import java.util.Scanner;
public class ์ฌ์ด๊ณ๋จ์ {
static Long[][] dp;
static int n;
final static long MOD = 1_000_000_000;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
dp = new Long[n+1][10];
for(int i=0; i<10; i++){
dp[1][i] = 1L;
}
long result = 0;
for(int i=1; i<=9; i++){
result += recur(n,i);
}
System.out.println(result % MOD);
sc.close();
}
/*
dist ๋ ์๋ฆฟ์, val์ ์๋ฆฟ๊ฐ์ ์๋ฏธํจ
์ฒซ์งธ ์๋ฆฌ์๋ ๊ฐ val์ด ๋์ด๊ธฐ ๋๋ฌธ์
๊ฒฝ์ฐ์ ์๋ 1๋ฐ์ ์๋ค. ์ฆ, dp[1]์ ๊ฐ ์๋ฆฟ๊ฐ์
1๋ก ์ด๊ธฐํ ๋์ด์์ด์ผํ๋ค.
*/
static long recur(int digit, int val) {
// ์ฒซ์งธ ์๋ฆฌ์์ ๋์ฐฉํ๋ค๋ฉด ๋์ด์ ํ์ํ ํ์ ์์
if(digit == 1) {
return dp[digit][val];
}
// ํด๋น ์๋ฆฌ์์ val๊ฐ์ ๋ํด ํ์ํ์ง ์์์ ๊ฒฝ์ฐ
if(dp[digit][val] == null) {
// val์ด 0์ผ๊ฒฝ์ฐ ์ด์ ์๋ฆฌ๋ 1๋ฐ์ ๋ชป์ด
if(val == 0) {
dp[digit][val] = recur(digit - 1 ,1);
}
// val์ด 9์ผ๊ฒฝ์ฐ ์ด์ ์ 8๋ฐ์ ๋ชป์ด
else if(val== 9) {
dp[digit][val] = recur(digit - 1, 8);
}
// ๊ทธ ์ธ์ ๊ฒฝ์ฐ๋ val-1๊ณผ val+1 ๊ฐ์ ๊ฒฝ์ฐ์ ์๋ฅผ ํฉํ ๊ฒฝ์ฐ์ ์๊ฐ ๋จ
else {
dp[digit][val] = recur(digit - 1, val - 1) + recur(digit - 1, val + 1);
}
}
return dp[digit][val] % MOD;
}
}