通过观察可以发现一个一个的向上求的时候用的都是已经得到的结果,所以就是很水很水啦~~~~
代码如下:
#include <iostream>
using namespace std;
__int64 f[26][26][26];
void w( int a, int b, int c ){
if( a <= 0 || b <= 0 || c <= 0 ){
f[a][b][c] = 1;
}else if( a < b && b < c ){
f[a][b][c] = f[a][b][c-1] + f[a][b-1][c-1] - f[a][b-1][c];
}else if( a > 20 || b > 20 || c > 20 ){
f[a][b][c] = f[20][20][20];
}else{
f[a][b][c] = f[a-1][b][c] + f[a-1][b-1][c] + f[a-1][b][c-1] - f[a-1][b-1][c-1];
}
}
int main(){
for( int i = 0; i <= 20; i++ ){
for( int j = 0; j <= 20; j++ ){
for( int k = 0; k <= 20; k++ ){
w( i, j, k );
}
}
}
while( 1 ){
int a, b, c;
cin >> a >> b >> c;
if( a == -1 && b == -1 && c == -1 ){
break;
}else if( a <= 0 || b <= 0 || c <= 0 ){
cout << "w(" << a << ", " << b << ", " << c
<< ") = " << 1 << endl;
}else if( a > 20 || b > 20 || c > 20 ){
cout << "w(" << a << ", " << b << ", " << c
<< ") = " << f[20][20][20] << endl;
}else{
cout << "w(" << a << ", " << b << ", " << c
<< ") = " << f[a][b][c] << endl;
}
}
}