题目链接:http://poj.org/problem?id=1579
太强大了。。。把递归转成动态规划。。。
//Accepted 220 KB 0 ms C++ 1438 B
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int M = 25;
int dp[M][M][M];
void w()
{
// if(a <= 0 || b <= 0 || c <= 0)
// return 1;
// if(a > 20 || b > 20 || c > 20)
// return w(20,20,20);
// if(a < b && b < c)
// // return w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c);
// else
// return w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) ;
for(int i = 0; i < 21; i ++)
{
for(int j = 0; j < 21; j++)
{
for(int k = 0; k < 21; k++)
{
if(i <= 0 || j <= 0 || k <= 0)
dp[i][j][k] = 1;
else 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 main()
{
int a,b,c;
while(cin >> a >> b >> c)
{
if(a == -1 && b == -1 && c == -1)
break;
memset(dp,0,sizeof(dp));
w();
if(a <= 0 || b <= 0 || c <= 0)
printf("w(%d, %d, %d) = %d\n",a,b,c,dp[0][0][0]);
else if(a > 20 || b > 20 || c > 20)
printf("w(%d, %d, %d) = %d\n",a,b,c,dp[20][20][20]);
else
printf("w(%d, %d, %d) = %d\n",a,b,c,dp[a][b][c]);
}
return 0;
}