給兩個數k和l,表示乙個l位的k進製數,定義k好數為:這個l位數的任意相鄰的兩位的兩個數都不能相鄰。換句話說就是他們的差的絕對值不能為1。求這樣的數一共有多少個
動態規劃問題,dp[i][j]表示第i位為j的情況下一共有多少個k好數。那麼很明顯dp[i][j]=sum(dp[i-1][m])(m範圍是0…k且m不與j相鄰)。
但是這有個問題,很顯然dp[i][j]的i至少大於1,沒有0位數,當i=1的時候也就是一位數,那麼末尾數字如果定了那肯定也只有乙個數而且肯定是k好數。所以先要初始化dp[i][m]=1(m屬於0…k-1)。接下來從2開始迴圈i到l,表示一共l位數。
然後開始迴圈j,j表示的是第i位為j的時候。j的範圍肯定是0..k-1。注意這裡不用考慮到首位為0的情況。因為我們最後計算一共有多少個數的時候是看第l位,第l位可能是1….k-1。所以我們要把他們加起來。dp[l][0]可以不管,但是前面的dp[i][0]還是要用來計算dp[i+1][j]的。所以j的範圍是0—k-1。
最後來構建dp[i][j],乙個for迴圈讓m從0–k-1,如果他的前一位(i-1)開始為的數是m且m不與當前位數(j)相鄰,那就要把dp[i-1][m]加上。
#include
using
namespace
std;
int main()
; long
long
int sum = 0, res = 0;
for (int i = 0; i1][i] = 1;
for (int i = 2; i <= l; i++)}}
for (int i = 1; i1000000007;
cout
<< res << endl;
}return
0;}
**很簡單,但是這個迴圈的範圍想了半天。一開始沒想清楚到底如何用dp[i][j]來計算答案。導致debug的時候改來改去 藍橋k好數
如題 問題描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值。輸入格式 輸...
藍橋杯 K好數
演算法訓練 k好數 問題描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33 共7個。由於這個數目很大,請你輸出它對1000000007取模後的值...
k好數 (藍橋杯)
時間限制 1 sec 記憶體限制 128 mb 提交 22 解決 3 提交 狀態 討論版 題目描述 如果乙個自然數n的k進製表示中任意的相鄰的兩位都不是相鄰的數字,那麼我們就說這個數是k好數。求l位k進製數中k好數的數目。例如k 4,l 2的時候,所有k好數為11 13 20 22 30 31 33...