1. 程式人生 > >ALGO-3 K好數(動態規劃)

ALGO-3 K好數(動態規劃)

con 正整數 const 方程 自然 自然數 include 由於 can

問題描述

如果一個自然數N的K進制表示中任意的相鄰的兩位都不是相鄰的數字,那麽我們就說這個數是K好數。求L位K進制數中K好數的數目。例如K = 4,L = 2的時候,所有K好數為11、13、20、22、30、31、33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。

輸入格式

輸入包含兩個正整數,K和L。

輸出格式 輸出一個整數,表示答案對1000000007取模後的值。 樣例輸入 4 2 樣例輸出 7 數據規模與約定

對於30%的數據,KL <= 106

對於50%的數據,K <= 16, L <= 10;

對於100%的數據,1 <= K,L <= 100。

解題思路:動態規劃,用dp[i][j]來存儲以j為開頭i位的K好數,狀態轉移方程為dp[i][j] = sum(dp[i - 1][k*]) *k不與i相鄰

     先循環位數(基變量),內層循環開頭

 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 int dp[105][105];
 5 const int mod = 1000000007;
 6 
 7 int main(void)
 8 {
 9     int K, L;
10     scanf("%d %d", &K, &L);
11     memset(dp, 0, sizeof(dp));
12     
13     for(int i = 0; i < K; i++){
14         dp[1
][i] = 1; 15 } 16 for(int i = 2; i <= L; i++){ 17 for(int j = 0; j < K; j++){ 18 for(int k = 0; k < K; k++){ 19 if(k != j + 1 && k != j - 1){ 20 dp[i][j] += dp[i - 1][k]; 21 dp[i][j] %= mod; 22 }
23 } 24 } 25 } 26 27 int sum = 0; 28 for(int i = 1; i < K; i++){ 29 sum += dp[L][i]; 30 sum %= mod; 31 } 32 33 printf("%d\n", sum % mod); 34 }

ALGO-3 K好數(動態規劃)