zoukankan      html  css  js  c++  java
  • 记忆搜索(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("
    "); 
    		}
    	}
    	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解滑雪题,未来几天会整理出代码

  • 相关阅读:
    pthread_mutex_init函数与pthread_mutexattr_init函数
    DPDK收发包全景分析
    Linux Bond的原理及其不足
    Cisco VPP启动流程
    组网基础之深入解析二层组播
    vpp命令总结
    全面挖掘Java Excel API 使用方法
    MySQL的varchar定义长度到底是字节还是字符
    MYSQL 用户管理
    MySql中的变量定义
  • 原文地址:https://www.cnblogs.com/AmosAlbert/p/12832319.html
Copyright © 2011-2022 走看看