递归变动态规划,这个就直接发代码了。
#include <iostream>
using namespace std;
int getw(int a,int b, int c, int*** arr)
{
if(a <0 || b <0 || c < 0 )
return 1;
else
return arr[a][b][c];
}
int main()
{
int a,b,c;
int*** arrw = new int**[20];
int i,j,k;
for ( i = 0; i < 20; i++ )
{
arrw[i] = new int* [20];
for ( j = 0; j < 20; j++ )
{
arrw[i][j] = new int[20];
}
}
for ( a = 0; a < 20; a++ )
{
for ( b = 0; b < 20; b++ )
{
for( c = 0; c < 20; c++ )
{
arrw[a][b][c]=0;
}
}
}
for( k = 0; k < 20; k++ )
{
arrw[0][0][k] = 2;
}
for ( a = 0; a < 20; a++ )
{
for ( b = 0; b < 20; b++ )
{
for( c = 0; c < 20; c++ )
{
if( a==0 && b == 0 )
continue;
if( b <= a )
{
arrw[a][b][c] = getw(a-1,b,c, arrw)+ getw(a-1,b-1,c,arrw) + getw(a-1,b,c-1,arrw)- getw(a-1,b-1,c-1,arrw);
}
else
{
if ( b >= c )
arrw[a][b][c] = getw(a-1,b,c, arrw)+ getw(a-1,b-1,c,arrw) + getw(a-1,b,c-1,arrw)- getw(a-1,b-1,c-1,arrw);
else
arrw[a][b][c] = getw(a,b,c-1, arrw) + getw(a,b-1,c-1,arrw)- getw(a,b-1,c, arrw);
}
}
}
}
//for ( a = 19; a < 20; a++ )
//{
// for ( b = 0; b < 20; b++ )
// {
// for( c = 0; c < 20; c++ )
// {
// cout<<"a["<<a+1<<"]["<<b+1<<"]["<<c+1<<"] = "<<arrw[a][b][c]<<" ";
// }
// }
//}
int a1,b1,c1;
cin>>a1>>b1>>c1;
while( !( a1 == -1 && b1 == -1 && c1 == -1) )
{
int t1 = a1, t2 = b1, t3 = c1;
if( a1 <= 0 || b1 <= 0 || c1<=0 )
{
a1 = b1 = c1 = -1;
}
else if( a1 >= 20 || b1 >= 20 || c1 >= 20 )
{
a1 = b1 = c1 =19;
}
else
{
a1--;
b1--;
c1--;
}
cout<<"w("<<t1<<", "<<t2<<", "<<t3<<") = "<<getw(a1,b1,c1,arrw)<<endl;
cin>>a1>>b1>>c1;
}
return 0;
}