记忆化搜索(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("
");
}
}
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解滑雪题,未来几天会整理出代码