购物网站建设带来的社会效益/汕头百度seo公司
今天学习记忆化搜索
题目链接
直接做肯定是不行的,会包含大量重复计算,必须采取一定策略,即“记忆化搜索”。
有几个注意点:
1.根据题意,本题有效数据范围是[0,20],最好对超出这个范围的数据做预处理,注意处理顺序 (我就在这里被坑了),否则可能会RE。当然把判断记忆数组的语句放在递归函数靠后一点也可以。
2.注意输出格式,尤其是那几个空格。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long int lli;
lli vis[21][21][21];
lli func(lli a,lli b,lli c){if(vis[a][b][c])return vis[a][b][c];if(a<=0||b<=0||c<=0)return 1;if(a<b&&b<c)vis[a][b][c]=func(a,b,c-1)+func(a,b-1,c-1)-func(a,b-1,c);vis[a][b][c]=func(a-1,b,c)+func(a-1,b-1,c)+func(a-1,b,c-1)-func(a-1,b-1,c-1);return vis[a][b][c];
}
int main(){lli a,b,c,d;memset(vis,0,sizeof(vis));while(1){scanf("%lld%lld%lld",&a,&b,&c);if(a==-1&&b==-1&&c==-1)break;if(a<=0||b<=0||c<=0)d=1;else if(a>20||b>20||c>20)d=func(20,20,20);elsed=func(a,b,c);printf("w(%lld, %lld, %lld) = %lld\n",a,b,c,d);}return 0;
}