蓝桥杯 K好数(dp)

来源:互联网 发布:2017淘宝一天的交易额 编辑:程序博客网 时间:2024/05/18 03:12

K好数


思路:动态规划即可。状态:dp[i][j]:=表示第i位以j结尾的K好数。

状态转移方程:dp[i][j]=∑dp[i-1][p](p!=j-1&&p!=j+1)(相邻两位不能是相邻的数字)。


代码:

#include<stdio.h>#include<stdlib.h># define MOD 1000000007long long f[101][100000];long long K(int l,int k){    int i,j,p;        //以数字i结尾的1位K好数的数目     for( i=0; i<k; i++)    {        f[1][i] = 1;    }        for ( i=2; i<=l; i++ )//求2位开始到l位的K好数     {        for( j=0; j<k; j++ )//i位的最后一位数j         {            f[i][j] = 0;            for ( p=0; p<k; p++)//i-1位的最后一位数p             {                if( p!=j-1 && p!=j+1 )                {                    f[i][j] =(f[i][j] + f[i-1][p])%MOD;                }                            }        }            }        //l位的K好数总数     long long sum = 0;    for ( i=1; i<k; i++)    {        sum += f[l][i];    }        return sum%MOD;}int main(){    int k,l;    scanf("%d%d",&k,&l);    long long sum = 0;    sum = K(l,k);printf("%I64d",sum);    return 0;}

原创粉丝点击