由于第一位上不能为零 所以需要枚举这种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; }