1234567章鱼君
【章某鱼的学习笔记】想了下还是都放在一个帖子里比较好

本帖最后由 1234567章鱼君 于 2019-11-12 22:44 编辑

一楼就拿来当个目录什么的好了

以后要翻笔记的时候也方便一些

要是一直开贴记笔记应该是要刷屏了orz

[line3]记忆化搜索[/line3]

1234567章鱼君
我果然是一个需要例题帮助才能理解的人
展开Biu

我果然是一个需要例题帮助才能理解的人

有例题真的会比较容易懂√

[查看全文]
1234567章鱼君
记忆化搜索
展开Biu

记忆化搜索

在网上找了一个比较典型的记忆化搜索的题目

对于一个递归函数w(a,b,c)

如果 a<=0 or b<=0 or c<=0 就返回值1

如果 a>20 or b>20 or c>20就返回w(20,20,20)

如果 a<b并且b<c 就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,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)

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int MAX=30;

int f[MAX][MAX][MAX]; //用数组记录,全局变量的初始值为0

int w(int a,int b,int c)

{

if(f[a][b][c]!=0) //不等于0即为已经搜索过,可以返回该值

return f[a][b][c];

if(a<=0||b<=0||c<=0)

return 1;

if(a>20||b>20||c>20)

return f[a][b][c]=w(20,20,20);

if(a<b&&b<c)

return f[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c-1);

return f[a][b][c]=w(a-1,b,c)+w(a-1,b-1,b)+w(a-1,b,c-1)-w(a-1,b-1,c-1);

} //返回时用f[a][b][c]=是为了记录该处的值,减少重复搜索的次数

int main()

{

int a,b,c;

while((scanf("%d%d%d",&a,&b,&c))!=EOF)

{

cout<<w(a,b,c)<<endl; //这里是偷懒直接输出要搜索的值了,具体输出看具体题目要求

}

return 0;

}

[查看全文]