1. 程式人生 > >ALGO-3 Java K好數 藍橋杯

ALGO-3 Java K好數 藍橋杯

con 動態 sca ant 計算 -c 輸出 pack 二維

package Main;


import java.io.InputStream;
import java.util.Scanner;
public class Main 
{ 
    public static long constant = 1000000007;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long k = in.nextLong();
        long l = in.nextLong();
        //dp[i][j] = num  表示第i位的數字j有num種可能性
long dp[][] = new long[103][103]; //二維數組用於存放所有可能的個數 //初始化 for(int i=0;i<k;i++) { dp[1][i] = 1; } for(int i=2;i<=l;i++) { for(int j=0;j<k;j++) { for(int f=0;f<k;f++) {
if((f-j!=-1)&&(f-j!=1)) { dp[i][j] += dp[i-1][f]; dp[i][j] = dp[i][j]%constant; } } } } long result = 0; //從1開始,去掉起始以0開頭的部分 for(int i=1;i<k;i++) { result
+= dp[(int) l][i]; result = result%constant; } System.out.println(result); } }
問題描述

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

解決思路:

  本題所說的K進制表示中任意的相鄰的兩位都不是相鄰的數字,是指K進制的數字使用0~k-1的數字組成該自然數,即4進制數:只能包含0,1,2三個數。同時對於相鄰兩位不是相鄰的數字是指2,3相鄰所以不能出現23這個數。

  該問題采用動態規劃的方法,通過部分解的方式層層遞進,首先求出K進制的1位數有幾種可能,進而得出2位數的幾種可能,依次得出結果。本次中采用數組dp[][]用於存儲計算的數,dp[i][j] = num 表示第i位的數字j有num種可能性。

步驟:

step1:首先初始化,將第一行的從0開始到K-1列填充數字1,代表有1種可能性

step2:其次,三層循環嵌套,外面兩層循環代表行列數,註意:其中行從2開始,最內一行從0到k-1遍歷,指帶在該範圍內,出現該數字的幾種可能性

step3:動態規劃的核心方程為:

dp[i][j] += dp[i-1][f];
dp[i][j] = dp[i][j]%constant;

邊求解邊求模,否則最後可能因數字太大出錯。

ALGO-3 Java K好數 藍橋杯