• 算法训练 K好数 (DP)


    问题描述

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

    题解:

    状态转移方程:dp[i][j] = dp[i][j] + dp[i-1][t]    //其中dp[i][j]表示一共有两位数字,首位为j时的方法数。

    AC代码

    #include<stdio.h>
    #include<math.h>
    #include<algorithm>
    #include<string.h>
    const int MOD = 1000000007;
    
    using namespace std;
    
    int main()
    {
        int k, l;               //k进制,长度为l
        int dp[200][200];         //dp[i][j]表示一共有i位数字,首位为j
        long long ans;
        while(scanf("%d%d", &k,&l) != EOF)
        {
            ans = 0;
            memset(dp, 0, sizeof(dp));
            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 t = 0; t < k; t++)
                    {
                        if(abs(t-j) != 1)   //判断相邻两位是否相邻
                            dp[i][j] = (dp[i][j] + dp[i-1][t]) % MOD;
                    }
                }
            }
            for(int i = 1; i < k; i++)
                ans = (ans + dp[l][i]) % MOD;
            printf("%lld
    ", ans);
        }
        return 0;
    }
    View Code
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    Markdown简单介绍和基本的语法
    Unsupported major.minor version 51.0问题的解决
    Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
    kqueue演示样例
    华为离职副总裁徐家骏的工作感悟
    菜鸟之路-浅谈设计模式之单例设计模式
    【gsl】生成随机数
    【C语言】pragma
    【数据结构】二叉堆
    【编程题目】查找最小的 k 个元素
  • 原文地址:https://www.cnblogs.com/h-hkai/p/8433563.html
Copyright © 2020-2023  润新知