搜索分析(DFS、BFS、递归、记忆化搜索)
搜索分析(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、递归、记忆化搜索)的更多相关文章
- HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)
题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...
- 洛谷 P1141【BFS】+记忆化搜索+染色
题目链接:https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字 0 与 1 组成的n×n 格迷宫.若你位于一格0上,那么你可以移动到相邻 4 ...
- hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)
#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...
- DFS——>记忆化搜索——>动态规划
以洛谷P1802 5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...
- hdu 1428(很好的一道题,最短路+记忆化搜索)
漫步校园 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 4628 Pieces(状态压缩+记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索 ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)
链接https://nanti.jisuanke.com/t/31454 思路 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞) 用记忆化搜索处理出来每个状态的胜负情况 因 ...
- 路径方案数_mod_SPFA_记忆化搜索_C++
本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易 ...
- POJ1088滑雪(记忆化搜索)
就是用DP,DP[i][j]是在这个(i,j)位置作为起点的最长长度. 因为可能会超时,DP的话每次就是记录,然后就不用回溯了. 很简单的DFS里面的记忆化搜索. #include <stdio ...
随机推荐
- 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 ...
- 闲谈Spring-IOC容器
闲聊 无论是做j2ee开发还是做j2se开发,spring都是一把大刀.当下流行的ssh三大框架中,spring是最不可替代的,如果不用hibernate和struts,我觉得都无关紧要,但是不能没有 ...
- P1146 硬币翻转
题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻 ...
- 浏览器缓存机制(HTTP缓存机制)
其机制是根据HTTP报文的缓存标识进行的. 过程:浏览器发起HTTP请求 – 服务器响应该请求.那么浏览器第一次向服务器发起该请求后拿到请求结果,会根据响应报文中HTTP头的缓存标识,决定是否缓存结果 ...
- 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 ...
- VHDL之code structure
1 VHDL units VHDL code is composed of at least 3 fundamental sections: 1) LIBRARY declarations: Con ...
- 【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# -->成功 判断为双引号变形注 ...
- MySql数据库多表操作
一.连接查询[连表查询.多表查询] 当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回 mysql支持三种类型的连接查询,分别为: 内连接查询(inner join) ...
- 一次由于 MTU 设置不当导致的网络访问超时
转自:http://weibo.com/ttarticle/p/show?id=2309404140904511340923 API 服务正常,但是调用总是超时.api端日志显示,响应速度很快. ...
- Centos7下的有多个版本的tomcat部署项目并访问
在tomcat下部署项目,第一次访问成功.但是发现有一个页面没有成功加载,发现是部署时少了一些东西.也不想去找出具体少了什么,直接把原来的项目移除,重新加载项目.重启tomcat,这时惊喜来了. 重启 ...