记忆搜索(MS)的深入理解

记忆化搜索(Memory Search),其实还是用递归函数实现的,通常函数名依然叫做dfs。
核心语句就是那两部分递归的关键语句块啦。

函数一开始的判断出口:if已经搜索过该部分就return数组中的值。所以一般将数组初始化为-1。
以斐波那契数列为例:
函数的递归前进语句:return fib[i]=fib[i-1]+fib[i-2];

这样就做到了数组的每个值只计算了一次,不会有多余的时间消耗。

还有一点!记住ms型dfs就必须是int型的了!! 不要在用bool或者void了!

记忆化搜索的fib求解的代码:

#include<iostream>
using namespace std;
const int MAX = 10000+5;
int fib[MAX];
int dfs(int n) {// 
	if(fib[n]!=-1) return fib[n];
	
	return fib[n]=dfs(n-1)+dfs(n-2);
	
}
int main()
{
	fib[1]=fib[2]=1;
	for(int i = 2; i<MAX; i++) {
		fib[i]=-1;
	}
	dfs(MAX-1);//别写成了MAX,那样输出的全是-1 
	for(int i = 1; i<=50; i++) {
		printf("%d ",fib[i]);
		if(i%5==0) { 
			printf("\n"); 
		}
	}
	return 0 ;
 } 

但是对于斐波那契这种简单的题目来说,用MS解那简直是大炮打蚊子。直接递归就行了
下面是直接递归代码:

#include<iostream>
using namespace std;
int n;
int fib(int num)
{
	if(num==1||num==2)
	{
		return (1);
	}
	else
	{
		return (fib(num-1)+fib(num-2));
	}
}
int main()
{
	cin>>n;
	cout<<fib(n)<<endl;
	return 0;
 } 

对比一下就知道了。

在斐波那契中ms和dp如此相似是因为fib的顺序是固定的!有规律的!所以体现不出MS的用处来!但是存在即合理!!!

在下面的题目中就显示出来MS的优点

参考 POJ1088 MS解滑雪题,未来几天会整理出代码

posted @ 2019-10-27 17:08  AmosAlbert  阅读(291)  评论(0)    收藏  举报