藍橋杯 K好數(動態規劃,C )

2021-09-11 08:13:23 字數 1302 閱讀 2064

問題描述

如果乙個自然數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。

思路

題目意思為長度為l的陣列中每乙個單元可以填入數字0-k的乙個,並且要求陣列中任意相鄰位置上元素的值不能相鄰。

動態規劃思路:設定狀態陣列dp[l][k]表示長度為l且以k結束的k好數的個數,狀態陣列為l*k的二維陣列。

初始狀態:長度為1的以任何數結束的k好數都只有乙個:dp[1][k] = 1,k=1,2,3…,k

遞推方程:長度為i以j結尾的k好數個數為dp[i][j] = sum(dp[i-1][m], m=1,2,3,…k且abs(m-j)!=1)

最後要求k進製長度為l的k好數,只需要把陣列dp中第l行所有元素加起來即可,但是考慮到k好數的第乙個位置的數不能為0,所以最後相加時去除dp[l][0](雖然dp[l][0]表示的是長度為l,以0結尾的k好數個數,但是因為這是一種可能的組合個數,dp[l][0]的數量與長度為l以0開頭的k好數個數一樣)。

#include #include #include using namespace std;

int main()

dp[i][j] = sum;}}

}int result = 0;

for (int i = 1; i < k;i++)

cout << result;

//system("pause");

return 0;

}

藍橋 K好數 動態規劃

題目描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。輸入 輸入包含兩個...

藍橋杯 演算法訓練 K好數 (動態規劃)

演算法訓練 k好數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33 共7個。由於這個數目...

藍橋杯 演算法訓練 K好數 (動態規劃)

問題描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。輸入格式 輸入包含...