藍橋 K好數

2021-08-17 06:27:42 字數 960 閱讀 7210

給兩個數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...