搜索分析(DFS、BFS、递归、记忆化搜索)

1、线性查找

在数组a[]={0,1,2,3,4,5,6,7,8,9,10}中查找1这个元素。

(1)普通搜索方法,一个循环从0到10搜索,这里略。

(2)递归(从中间向两边)

 //递归一定要写成记忆化递归
#include <bits/stdc++.h>
using namespace std;
bool vis[];
int count1=; void search(int n){
count1++;
if(n>||n<||vis[n]){
//cout<<"back"<<endl;
}
else if(n==){
vis[n]=true;
cout<<"find"<<endl;
}
else {
vis[n]=true;
search(n-);
search(n+); }
} int main(){
int a[]={,,,,,,,,,,};
search();
cout<<count1<<endl;
return ; }

递归(从中间到两边)

这种方法一定要加标记数组,不然会出现死循环。

其中一个死循环:

search(9)->search(8)->search(9)

而这样的死循环太多了。

其实分析的时候直接把递归的树形图画出来就好了,直观而且方便。

这样带有标记数组的递归,本质上就是记忆化递归。

所以这种环形的递归都可以写成记忆化递归。

(3)递归(从后面向前面)

 #include <bits/stdc++.h>
using namespace std; int count1=; void search(int n){
count1++;
if(n>||n<){
}
else if(n==){
cout<<"find"<<endl;
}
else {
search(n-);
}
} int main(){
int a[]={,,,,,,,,,,};
search();
cout<<count1<<endl;
return ; }

递归(从后面向前面)

这种方法是不需要标记数组的,因为递归是线性的,而不是环形的,递归之间没有交叉,不会造成重复访问。

这种和求阶乘的是一样的。

(4)BFS(从中间向两边)

 #include <bits/stdc++.h>
using namespace std;
bool vis[];
int count1=;
queue<int> que; void searchBFS(int n){
que.push(n);
while(!que.empty()){
count1++;
cout<<"count1:"<<count1<<endl; int tmp=que.front();
que.pop();
vis[tmp]=true;
cout<<"tmp:"<<tmp<<endl;
if(tmp==) {
cout<<"find"<<endl;
return ;
}
else{
if(tmp->=&&!vis[tmp-]) que.push(tmp-);
if(tmp+<=&&!vis[tmp+]) que.push(tmp+);
}
}
} int main(){
int a[]={,,,,,,,,,,};
searchBFS();
cout<<count1<<endl;
return ; }

BFS(从中间向两边)

这种BFS也是一定要带标记数组的,所以也可以写成记忆化。

这种BFS如果不带标记数组的话,也是可以得到正确答案的,不过会重复算很多算过的东西。

例如:9 8 10 7 9 9 6 8 8 10 8 10 .........

比如说上面的9就访问了很多次,而由于队列FIFO的特性,所以虽然重复算很多次,还是会得到正确答案。

因为7、6那一支会逐渐到1的。

当然,BFS也可以直接写成线性的,这样也是不需要标记数组的。

其实还是那样,把情况的树形图画出来就很舒服了,直观方便。

二、阶乘

(1)普通求阶乘方法:略。

(2)阶乘的递归实现DFS

阶乘的递归实现

 #include <bits/stdc++.h>
using namespace std;
int jiechen(int n){
if(n==) return ;
else{
return n*jiechen(n-);
}
}
int main(){
cout<<jiechen()<<endl;
return ;
}

DFS

从尾直接算到头,不需要标记数组

(2)阶乘的栈实现

 /*
伪码:
我们求f(n),f(n)入栈
在栈不空的情况下(下面循环)
出栈
f(n)=f(n-1)*n
如果f(n-1)没有被求出来,直接入栈
*/ //对数组而言,我们操作的肯定是下标,而一定不是数组元素的值
#include <bits/stdc++.h>
using namespace std;
stack<int> sta;
int a[]; int jiechen(int n){
a[]=;
sta.push(n);
while(!sta.empty()){
int tmp=sta.top();
sta.pop();
//如果a[tmp-1]被计算了
if(a[tmp-]!=){
a[tmp]=a[tmp-]*tmp;
cout<<tmp<<" "<<a[tmp]<<endl;
}
else{
sta.push(tmp);
sta.push(tmp-);
}
}
return a[];
} int main(){
cout<<jiechen()<<endl;
return ;
}

阶乘的栈实现

对数组而言,我们操作(存储进栈或者队列或者其它操作)的肯定是下标,而一定不是数组元素的值 

其实栈实现和递归实现是一样的,因为递归在计算机内部就是用栈实现的。

搜索分析(DFS、BFS、递归、记忆化搜索)的更多相关文章

  1. HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

    题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...

  2. 洛谷 P1141【BFS】+记忆化搜索+染色

    题目链接:https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字 0 与 1 组成的n×n 格迷宫.若你位于一格0上,那么你可以移动到相邻 4 ...

  3. hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  4. DFS——>记忆化搜索——>动态规划

    以洛谷P1802  5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...

  5. hdu 1428(很好的一道题,最短路+记忆化搜索)

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. HDU 4628 Pieces(状态压缩+记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索  ...

  7. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)

    链接https://nanti.jisuanke.com/t/31454 思路 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞) 用记忆化搜索处理出来每个状态的胜负情况 因 ...

  9. 路径方案数_mod_SPFA_记忆化搜索_C++

    本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易 ...

  10. POJ1088滑雪(记忆化搜索)

    就是用DP,DP[i][j]是在这个(i,j)位置作为起点的最长长度. 因为可能会超时,DP的话每次就是记录,然后就不用回溯了. 很简单的DFS里面的记忆化搜索. #include <stdio ...

随机推荐

  1. SQL学习--Select(一)TOP、派生表、连接、谓词

    TOP关键字 WITH TIES t.title,sum(s.qty)as totalSales from sales s left join titles t on s.title_id=t.tit ...

  2. 闲谈Spring-IOC容器

    闲聊 无论是做j2ee开发还是做j2se开发,spring都是一把大刀.当下流行的ssh三大框架中,spring是最不可替代的,如果不用hibernate和struts,我觉得都无关紧要,但是不能没有 ...

  3. P1146 硬币翻转

    题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻 ...

  4. 浏览器缓存机制(HTTP缓存机制)

    其机制是根据HTTP报文的缓存标识进行的. 过程:浏览器发起HTTP请求 – 服务器响应该请求.那么浏览器第一次向服务器发起该请求后拿到请求结果,会根据响应报文中HTTP头的缓存标识,决定是否缓存结果 ...

  5. Android 解决小米手机Android Studio安装app 报错的问题It is possible that this issue is resolved by uninstalling an existi

    Android Studio升级到2.3版本之后,小米手机MIUI8不能运行Android Studio程序,报如下错误: Installation failed with message Faile ...

  6. VHDL之code structure

     1 VHDL units VHDL code is composed of at least 3 fundamental sections: 1) LIBRARY declarations: Con ...

  7. 【sqli-labs】 less16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)

    ' or 1=1# -->失败 1" or 1=1# -->失败 1') or 1=1# -->失败 1") or 1=1# -->成功 判断为双引号变形注 ...

  8. MySql数据库多表操作

    一.连接查询[连表查询.多表查询] 当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回 mysql支持三种类型的连接查询,分别为: 内连接查询(inner join) ...

  9. 一次由于 MTU 设置不当导致的网络访问超时

    转自:http://weibo.com/ttarticle/p/show?id=2309404140904511340923 API 服务正常,但是调用总是超时.api端日志显示,响应速度很快. ​​ ...

  10. Centos7下的有多个版本的tomcat部署项目并访问

    在tomcat下部署项目,第一次访问成功.但是发现有一个页面没有成功加载,发现是部署时少了一些东西.也不想去找出具体少了什么,直接把原来的项目移除,重新加载项目.重启tomcat,这时惊喜来了. 重启 ...