k好数 noip 动态规划

来源:互联网 发布:虚拟机安装ubuntu出错 编辑:程序博客网 时间:2024/05/18 22:15
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
数据规模与约定


对于30%的数据,KL <= 106;


对于50%的数据,K <= 16, L <= 10;


对于100%的数据,1 <= K,L <= 100。

解答:

首先想到的是搜索来暴力解决,但经实验只能通过百分之五十的数据,本题可以用动态规划来解

dp[i][j]  代表第i位为j的次数

则状态转移方程为 dp[i][j]=sum{dp[i-1][k]};  k为与j不相邻的数。

#include<stdio.h>#include<stdlib.h>#include<string.h>int dp[101][101];int main(){    int k,l;    scanf("%d%d",&k,&l);    if(l==1)  printf("%d\n",k);    else    {    int i,j,m;    //dp[l][k]  第L位为K    for(i=1;i<k;i++)      dp[1][i]=1;    for(i=2;i<=l;i++)        for(j=0;j<k;j++)           for(m=0;m<k;m++)               if(m!=j+1&&m!=j-1)                  dp[i][j]=(dp[i][j]+dp[i-1][m])%1000000007;    int total=0;    for(i=0;i<k;i++)        total=(total+dp[l][i])%1000000007;    printf("%d\n",total);    }    return 0;}





0 0
原创粉丝点击