蓝桥杯,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()