摘要:记忆化搜索,DFS
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int size = 20;
int value[size+1][size+1][size+1] = {0};
int flag[size+1][size+1][size+1] = {0};
int calculate(int a, int b, int c)
{
if( a<=0 || b<=0 || c<=0 ){
return 1;
}
if( a>20 || b>20 || c>20 ){
return calculate(20, 20 ,20);
}
if( flag[a][b][c]== 1){
return value[a][b][c];
}
if( a<b && b<c ){
int result = calculate(a, b, c-1)+calculate(a, b-1, c-1)-calculate(a, b-1, c);
flag[a][b][c] = 1;
value[a][b][c] = result;
return result;
}
int result = calculate(a-1, b, c) + calculate(a-1, b-1, c) + calculate(a-1, b, c-1) - calculate(a-1, b-1, c-1);
flag[a][b][c] = 1;
value[a][b][c] = result;
return result;
}
int main()
{
memset(value, sizeof(value), 0);
memset(flag, sizeof(flag), 0);
int a, b, c;
value[0][0][0] = 1;
flag[0][0][0] = 1;
while( cin >> a >> b >> c ){
if(a==-1 && b==-1 && c==-1){
break;
}
cout << "w(" << a << ", " << b << ", " << c << ") = " << calculate(a, b, c) << endl;
}
return true;
}