这道题是把题目给你的好像是递归的方式改变成 递推的方式, 只要预处理一下,答案就直接全部出来了
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int dp[22][22][22];
//w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
int main()
{
int a, b, c, i, j, k;
for(i=0;i<=20;i++)//初始化
for(j=0;j<=20;j++)
{
dp[i][j][0]=dp[0][i][j]=dp[i][0][j]=1;
dp[j][i][0]=dp[0][j][i]=dp[j][0][i]=1;
}
for(i=1;i<=20;i++)//计算答案
for(j=1;j<=20;j++)
for(k=1;k<=20;k++)
{
if(i<j&&j<k)
dp[i][j][k]=dp[i][j][k-1]+dp[i][j-1][k-1]-dp[i][j-1][k];
else
dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k]+dp[i-1][j][k-1]-dp[i-1][j-1][k-1];
}
int ta, tb, tc;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
if(a==-1&&b==-1&&c==-1) break;
ta=a, tb=b, tc=c;
if(a<=0||b<=0||c<=0)//刚开始判断小于等于0的条件和大于20的条件位置不对就错了,换回来就对了
a=b=c=0;
if(a>20||b>20||c>20)
a=b=c=20;
printf("w(%d, %d, %d) = %d\n",ta,tb,tc,dp[a][b][c]);
}
return 0;
}