#include <iostream> using namespace std;
//***********************常量定义*****************************
const int NUM = 22;
//*********************自定义数据结构*************************
//********************题目描述中的变量************************
//**********************算法中的变量**************************
int dp[NUM][NUM][NUM]; bool visit[NUM][NUM][NUM];
//***********************算法实现***************************** /* //记忆化搜索 递归形式的实现 int RecSolve( int a, int b, int c ) { if( a<=0 || b<=0 || c<=0 ) { return 1; } if( a>20 || b>20 || c>20 ) { return RecSolve( 20, 20, 20 ); }
//先查找,看以前是否计算过 if( visit[a][b][c] ) { return dp[a][b][c]; }
visit[a][b][c] = true; if( a<b && b<c ) { return dp[a][b][c] = RecSolve(a, b, c-1) + RecSolve(a, b-1, c-1) - RecSolve(a, b-1, c); } else { return dp[a][b][c] = RecSolve(a-1, b, c) + RecSolve(a-1, b-1, c) + RecSolve(a-1, b, c-1) - RecSolve(a-1, b-1, c-1); } } */ //DP实现 int DPSolve( int a, int b, int c ) { if( a<0 || b<0 || c<0 ) { a = b = c = 0; } if( a>20 || b>20 || c>20 ) { a = b = c = 20; }
//a ,b ,c可能为负,必须放在if( a<0 || b<0 || c<0 )之后 if( visit[a][b][c] ) { return dp[a][b][c]; }
int x, y, z; for( z=0; z<=a; z++ ) { for( x=0; x<=b; x++ ) { for( y=0; y<=c; y++ ) { if( z==0 || x==0 || y==0 ) { dp[z][x][y] = 1; } else if( z<x && x<y ) { dp[z][x][y] = dp[z][x][y-1] + dp[z][x-1][y-1] - dp[z][x-1][y]; } else { dp[z][x][y] = dp[z-1][x][y] + dp[z-1][x-1][y] + dp[z-1][x][y-1] - dp[z-1][x-1][y-1]; } //visit是全局变量 //如果已经计算过,则设置标记 visit[z][x][y] = true; } } } return dp[a][b][c]; }
//************************main函数****************************
int main() { //freopen( "in.txt", "r", stdin ); memset( dp, 0, sizeof(dp) ); memset( visit, false, sizeof(visit) );
int a, b, c; while( cin >> a >> b >> c, !( a == -1 && b == -1 && c == -1 ) ) { int ans = DPSolve( a, b, c ); cout << "w(" << a << ", " << b << ", " << c << ") = " << ans << endl; }
return 0; }
posted @
2013-10-11 11:45
junxing
阅读(
156 )
评论()
收藏
举报