记忆化搜索。 题目把递归式都给我们了,我们只要把中途算出的结果记录下来 #include<iostream> using namespace std; int dp[25][25][25]; int dfs(int a,int b,int c) { if(a<=0||b<=0||c<=0) return 1; if(dp[a][b][c]!=-1) return dp[a][b][c]; else { if(a<b&&b<c) return dp[a][b][c]= dfs(a,b,c-1)+dfs(a,b-1,c-1)-dfs(a,b-1,c); else return dp[a][b][c]=dfs(a-1,b,c)+dfs(a-1,b-1,c)+ dfs(a-1,b,c-1)-dfs(a-1,b-1,c-1); } } int main() { int a,b,c; memset(dp,-1,sizeof(dp)); while(scanf("%d%d%d",&a,&b,&c)) { if(a==-1&&b==-1&&c==-1) break; if(a<0||b<0||c<0) { printf("w(%d, %d, %d) = %d/n",a,b,c,1); continue; } if(a>20||b>20||c>20) { dp[20][20][20]=dfs(20,20,20); printf("w(%d, %d, %d) = %d/n",a,b,c,dp[20][20][20]); continue; } if(dp[a][b][c]==-1) dp[a][b][c]=dfs(a,b,c); printf("w(%d, %d, %d) = %d/n",a,b,c,dp[a][b][c]); } return 0; }