由于第一位上不能为零 所以需要枚举这种dp[1][i] 状态转移方程dp[i][j]=d[i+1][0....k-1]

#include <algorithm>
#include <cstring>
#include <cstdio>

int dp[20][20];
int n,k;
int dfs(int x,int y)
{
    if(x==n) return dp[x][y]=1;
    if(dp[x][y]!=-1) return dp[x][y];
    dp[x][y]=0;
    for(int i=1; i<k; i++)
        dp[x][y]+=dfs(x+1,i);
    if(y)
        dp[x][y]+=dfs(x+1,0);
    return dp[x][y];
}
int main()
{
    while(scanf("%d%d",&n,&k)==2)
    {
        memset(dp, -1, sizeof(dp));
        int ans=0;
        for(int i=1; i<k; i++)
        {
            dfs(1,i);
            ans+=dp[1][i];
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted on 2013-08-14 11:51  风流monkey  阅读(141)  评论(0编辑  收藏  举报