传送门:http://acm.timus.ru/problem.aspx?space=1&num=1009
题意:
求有N位数字的K进制数且不包含有连续0的数有多少个,必须是有效的 比如0001235 不是一个有效的7位数字,而是4位数字
例如 1001 是无效的 (连续0)
1010 才是有效的
状态转移方程
F(N,K)= (K-1) * [ F(N-1,K)+F(N-2,K) ]
注意的是F(0,K)=1 F(1,K)=K-1
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include<cstdio>
#include<limits.h>
using namespace std;
long long Best (int n,int k);
long long Dp[17][11];
int main()
{
int n,k;
int i,i2;
//initial
memset(Dp,-1,sizeof(Dp));
for (i=0;i<=10;i++) // n等于0时 其数值都为1;
{
Dp[0][i]=1;
Dp[1][i]=i-1;
}
while (scanf("%d%d",&n,&k)!=EOF)
{
printf("%d\n",Best(n,k));
}
return 0;
}
long long Best (int n,int k)
{
if (Dp[n][k]!=-1)
return Dp[n][k];
return Dp[n][k]=(k-1)*(Best(n-1,k)+Best(n-2,k));
}