题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1579
所谓记忆化,简单理解就是dfs+dp,水题不多说了。。。
View Code
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define MAXN 55 6 int dp[MAXN][MAXN][MAXN]; 7 8 //记忆话搜索 9 int dfs(int a,int b,int c){ 10 if(a<=0||b<=0||c<=0)return 1; 11 if(a>20||b>20||c>20)return dfs(20,20,20); 12 if(dp[a][b][c])return dp[a][b][c]; 13 if(a<b&&b<c){ 14 dp[a][b][c]+=dfs(a,b,c-1)+dfs(a,b-1,c)-dfs(a,b-1,c); 15 }else { 16 dp[a][b][c]+=dfs(a-1,b,c)+dfs(a-1,b-1,c)+dfs(a-1,b,c-1)-dfs(a-1,b-1,c-1); 17 } 18 return dp[a][b][c]; 19 } 20 21 22 int main(){ 23 int a,b,c,ans; 24 memset(dp,0,sizeof(dp)); 25 while(~scanf("%d%d%d",&a,&b,&c)){ 26 if(a==-1&&b==-1&&c==-1)break; 27 ans=dfs(a,b,c); 28 printf("w(%d, %d, %d) = %d\n",a,b,c,ans); 29 } 30 return 0; 31 }