蓝桥杯,k好数,动态规划

题目描述

问题描述

如果一个自然数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 

解题思路

对于K进制,它的基数为0到K-1;对于L位K进制,每一位都有K个数字可选。因此只要依次确定每一位的数字,并且根据题目要求使相邻的两位不是相邻的数字,当所有位的数字都确定时,就是所求的答案。以K = 4,L = 2为例,如下表:

  0 1 2 3
0 1 1 1 1
1 3 2 3 3

对于第一位数字,它可以是任意数字,因此第一行全部为1;对于第二位数字,因为其数字不能和第一位相邻,因此dp[1][0]=dp[0][0]+dp[0][2]+dp[0][3]=1+1+1=3,依次类推。当两位数字全部确定时,因为第一位数字不能为0,因此ans=dp[1][1]+dp[1][2]+dp[1][3]=2+2+3=7。

代码

 

def dp(K, L):
    dp = [[0 for i in range(K)] for j in range(L)]
    for i in range(K):
        dp[0][i] = 1
    for i in range(1, L):
        for j in range(K):
            for k in range(K):
                if abs(j-k) != 1:
                    dp[i][j] += dp[i-1][k]
                    dp[i][j] %= 1000000007
    ans = 0
    for i in range(1, K):
        ans += dp[L-1][i]
        ans %= 1000000007
    return ans
        
        
    
def main():
    k, l = map(int, input().split())
    print(dp(k, l))


if __name__ == "__main__":
    main()

 

posted @ 2020-02-13 12:46  Marvin-wen  阅读(650)  评论(0编辑  收藏  举报