• 蓝桥杯,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()
  • 相关阅读:
    呼叫中心架构设计
    呼叫中心架构设计
    python数据分析工具安装集合
    QQ 聊天机器人小薇 2.0.0 发布!
    QQ 聊天机器人小薇 2.0.0 发布!
    spark编程python实例
    Intellij idea配置scala开发环境
    stm32时钟设置函数
    ESP8266 TCP传输AT指令顺序
    WIFI接入Internet配置过程
  • 原文地址:https://www.cnblogs.com/marvin-wen/p/12303184.html
Copyright © 2020-2023  润新知