ALGO-3 K好數(動態規劃)
阿新 • • 發佈:2018-03-02
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好數(動態規劃)