#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
/*
int dp[109][109][109];
int w(int a,int b,int c)
{
if(dp[a][b][c]) return dp[a][b][c];
else
{
if(a<=0||b<=0||c<=0)
return 1;
else if(a<b&&b<c)
return dp[a][b][c] = w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
else
return dp[a][b][c] = w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1) ;
}
}
int main()
{
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))
{
memset(dp,0,sizeof(dp));
if(a==-1&&b==-1&&c==-1)break;
if(a<=0||b<=0||c<=0)
printf("w(%d, %d, %d) = %d\n",a,b,c,1);
else if(a>20||b>20||c>20)
printf("w(%d, %d, %d) = %d\n",a,b,c,w(20,20,20));
else
printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
}
return 0;
}
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
/*
记忆化搜索
计算过的就存起来,不用多次递归
*/int dp[109][109][109];
int w(int a,int b,int c)
{
if(dp[a][b][c]) return dp[a][b][c];
else
{
if(a<=0||b<=0||c<=0)
return 1;
else if(a<b&&b<c)
return dp[a][b][c] = w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
else
return dp[a][b][c] = w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1) ;
}
}
int main()
{
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))
{
memset(dp,0,sizeof(dp));
if(a==-1&&b==-1&&c==-1)break;
if(a<=0||b<=0||c<=0)
printf("w(%d, %d, %d) = %d\n",a,b,c,1);
else if(a>20||b>20||c>20)
printf("w(%d, %d, %d) = %d\n",a,b,c,w(20,20,20));
else
printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
}
return 0;
}
本文介绍了一个使用记忆化搜索解决特定问题的C++程序实例。该程序通过递归方式计算特定条件下的数值,并利用三维数组存储已计算结果避免重复计算,以此提高效率。文章通过具体的代码示例展示了如何实现这一算法。
4万+

被折叠的 条评论
为什么被折叠?



