转载请注明出处:http://blog.csdn.net/a1dark
分析:递推公式已经给出了、但是如果直接递归实现的话、必然会超时、所以我们预处理一下、根据公式、DP出所有答案、
#include<stdio.h> #include<string.h> int dp[25][25][25]; int fun(int a,int b,int c){ if(a<=0||b<=0||c<=0)return 1; else return dp[a][b][c]; } void init(){ for(int i=1;i<=20;i++){ for(int j=1;j<=20;j++){ for(int k=1;k<=20;k++){ if(i<j&&j<k) dp[i][j][k]=fun(i,j,k-1)+fun(i,j-1,k-1)-fun(i,j-1,k); else dp[i][j][k]=fun(i-1,j,k)+fun(i-1,j-1,k)+fun(i-1,j,k-1)-fun(i-1,j-1,k-1); } } } } int solve(int a,int b,int c){ if(a<=0||b<=0||c<=0)return 1; else if(a>20||b>20||c>20)return dp[20][20][20]; else return dp[a][b][c]; } int main(){ int x,y,z; init(); while(scanf("%d%d%d",&x,&y,&z)!=EOF){ if(x==-1&&y==-1&&z==-1)break; dp[20][20][20]=1048576; printf("w(%d, %d, %d) = %d\n",x,y,z,solve(x,y,z)); } return 0; }