zoukankan      html  css  js  c++  java
  • dp 之路

    问题描述:

    如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。

    思路:

    dp[i][j],其中i代表前i位数,j代表最后一位数是j,那么l位数只需要在l-1位数的最后加上符合条件的0~k-1,这样就找到了状态转移方程

    代码:

    #include <stdio.h>
    #include <string.h>
    //#include <algorithm>
    using namespace std;
    #define mod 1000000007
    __int64 dp[105][105];
    int main()
    {
        int k,l,i,j,x;
        scanf("%d%d",&k,&l);
        for(i = 0; i<k; i++)
            dp[1][i] = 1;
        for(i = 2; i<=l; i++)
            for(j = 0; j<k; j++)
                for(x = 0; x<k; x++)
                    if(x!=j-1&&x!=j+1)//根据题意,本位的数字与前面的数字是不能相邻的
                    {
                        dp[i][j]+=dp[i-1][x];
                        dp[i][j]%=mod;
                    }
        __int64 sum = 0;
        for(i = 1; i<k; i++)
        {
            sum+=dp[l][i];
            sum%=mod;
        }
        printf("%I64d ",sum%mod);
        return 0;
    }

  • 相关阅读:
    DOM编程
    BOM编程
    JavaScript
    CSS
    HTML入门
    shiro与项目集成开发
    shiro授权测试
    散列算法
    shiro认证流程
    spring boot 入门及示例
  • 原文地址:https://www.cnblogs.com/ACWQYYY/p/4378509.html
Copyright © 2011-2022 走看看