[专题练习] Part1 搜索
本文中的链接有的是题解有的是题目链接,已经搞混了...
一.DFS(深度优先搜索)
过于水略过。
二.BFS(广度优先搜索)
同上。
三.记忆化
记忆化搜索,就是我们的状态会重复利用,为了防止状态的重复计算耗费不必要的时间,我们可以把这个状态的结果记录下来,然后查询表中的结果就行了。
一般来所,记忆化搜索是和DP等价的。如果递推的DP不好写,可以考虑用记忆化搜索实现,但是因为是递归,所以常数略大。记忆化搜索有明显的优点,就是可以不用考虑状态在哪里终止,只用知道状态会终止就行了。
四.搜索剪枝
这是一门博大精深的学问, 通常用于解决搜索时间复杂度过高的问题。
原理就是在庞大的搜索树上剪去不可能对答案产生贡献的枝条。
搜索+剪枝的时间复杂度是$O(玄学)$,因为我们只能通过经验来估测剪枝效果。
所以考试打暴力的时候一定要多写剪枝,尤其是奇形怪状的玄学剪枝。
几道例题:
贪心出牌,出完顺子枚举出其他的尽可能出的多的牌的组合。
加上最优化剪枝,如果现在出了$ans-1$次没有出完就剪枝。
我当时用了$lowbit$优化常数,然后把整个棋盘分成上下两部分,如果上半部分空位比下半部分多,就从下半部开始搜索。这样就水过去了。
其实也可以按格搜索,优先搜可填的少的格。
还有$A^*$剪枝,如果剩下的格子都填9还比$ans$小的话就剪枝。
通常使用的剪枝技巧
1.最优性剪枝。
2.$A^*$剪枝。
3.改变搜索顺序,优先搜索扩展出的状态比较少的状态。
五.双向广搜
双向广搜就是从起点和终点开始搜索,每次各搜一层,如果相遇,则得出答案。
双向广搜可以使搜索树减少一半以上,大大优化了时间复杂度。
广度双向搜索通常有两种方法:
两个方向交替扩展
选择结点个数较少的那个方向先扩展.
方法2克服了两方向结点的生成速度不平衡的状态,明显提高了效率。
1.poj3523The Morning after Halloween
其实这题直接$bfs$就可过,但是为了追求效率,用双向广搜甚至可以减少一半的时间。
六.meet in the middle
这个和双向搜索有差别,思路是把问题折半,然后合并,减少一半的搜索层数。
经典例题NOI2001方程的解数
先搜前3个解,把结果用hash表存一下,然后搜后3个解,在hash表中查询个数。
这题太恶心了,用mapT飞,用hash表Mle,大力取模WA。
无药可救...
- #include <iostream>
- #include <cstdio>
- #include <queue>
- #include <cstring>
- #include <map>
- #include <algorithm>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- #define reg register
- inline int read() {
- int res=;char ch=getchar();bool fu=;
- while(!isdigit(ch))fu|=(ch=='-'), ch=getchar();
- while(isdigit(ch))res=(res<<)+(res<<)+(ch^),ch=getchar();
- return fu?-res:res;
- }
- int n, m;
- int k[], p[];
- int mi[][];
- int ans;
- map <int, int> mp;
- void dfs1(int dep, int sum)
- {
- if (dep > n / ) {
- mp[sum]++;
- return ;
- }
- for (reg int i = ; i <= m ; i ++)
- dfs1(dep + , sum + k[dep] * mi[i][p[dep]]);
- }
- void dfs2(int dep, int sum)
- {
- if (dep > n) {
- ans += mp[-sum];
- return ;
- }
- for (reg int i = ; i <= m ; i ++)
- dfs2(dep + , sum + k[dep] * mi[i][p[dep]]);
- }
- int main()
- {
- n = read(), m = read();
- for (reg int i = ; i <= n ; i ++) k[i] = read(), p[i] = read();
- for (reg int i = ; i <= m ; i ++)
- {
- mi[i][] = ;
- for (reg int j = ; j <= m ; j ++) mi[i][j] = mi[i][j - ] * i;
- }
- dfs1(, );
- dfs2(n / + , );
- cout << ans << endl;
- return ;
- }
方程的解数
七.迭代加深搜索(IDDFS)
某些题状态无限,bfs无法承受空间复杂度,可以限制dfs搜索的深度。
每次增加深度限制,每次可能对之前搜过的状态多次计算,但是由于状态每一层都扩展的十分多,所以相比于扩展一层,重复上面的状态的复杂度还是可以接受的。
可以逐步增加答案的分数的个数,然后可以限制住状态的无限扩展...其实我不会233(逃.
2.poj2248 Addition Chains (此题解访问人数已经突破100人啦!!)
和上面一样逐步扩展答案的个数,然后再加上一些十分有用的剪枝,才能A掉这题,详情见链接。
八.迭代加深A*(IDA*)
普通迭代加深搜索加入A*剪枝。
估价函数的一小点变动可能导致时间上的很大的差别,详情点进链接看看。
2.poj2286The Rotation Game
估价函数为8-中间出现次数最多的数字的个数。
九.随机化
过于玄学,略过。
[专题练习] Part1 搜索的更多相关文章
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
- Leetcode之回溯法专题-79. 单词搜索(Word Search)
Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...
- [kuangbin带你飞]专题一 简单搜索 题解报告
又重头开始刷kuangbin,有些题用了和以前不一样的思路解决.全部题解如下 点击每道题的标题即可跳转至VJ题目页面. A-棋盘问题 棋子不能摆在相同行和相同列,所以我们可以依此枚举每一行,然后标记每 ...
- kuangbin专题 专题一 简单搜索 Oil Deposits HDU - 1241
题目链接:https://vjudge.net/problem/HDU-1241 题意:问有几个油田,一个油田由相邻的‘@’,组成. 思路:bfs,dfs都可以,只需要遍历地图,遇到‘@’,跑一遍搜索 ...
- kuangbin专题 专题一 简单搜索 迷宫问题 POJ - 3984
题目链接:https://vjudge.net/problem/POJ-3984 这个题目,emm,上代码,看的估计应该是刚开始接触搜索的,我带点注释,你能慢慢理解. #include <ios ...
- [kuangbin带你飞]专题一 简单搜索 - E - Find The Multiple
//Memory Time //2236K 32MS #include<iostream> using namespace std; ]; //保存每次mod n的余数 //由于198的余 ...
- Leedcode算法专题训练(搜索)
BFS 广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点.需要注意的是,遍历过的节点不能再次被遍历. 第一层: 0 -> {6,2,1,5} ...
- [kuangbin带你飞]专题一 简单搜索 棋盘问题
题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...
- [kuangbin带你飞]专题一 简单搜索
ID Origin Title 454 / 1008 Problem A POJ 1321 棋盘问题 328 / 854 Problem B POJ 2251 Dungeon Ma ...
随机推荐
- myeclipse 保存含中文的jsp失败,提示内容含有 ISO-8859-1 不支持的字符
就是这货,网上说各种设置首选项编码神马的,但我只是临时学一学jsp,装的myeclipse貌似不全,没有他们说的选项,后来发现了解决方案: 出错是因为我的jsp文件是用于在其他jsp中引入的,所以没有 ...
- 2010年NOIP普及组复赛题解
题目及涉及的算法: 数字统计:入门题: 接水问题:基础模拟题: 导弹拦截:动态规划.贪心: 三国游戏:贪心.博弈论. 数字统计 题目链接:洛谷 P1179 这道题目是一道基础题. 我们只需要开一个变量 ...
- Spring Boot2 系列教程(六)自定义 Spring Boot 中的 starter
我们使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中.Starter 为我们带来了众多的自动化配置,有了这些自动化配置,我们可以不费吹灰之力就能搭建一个生产级开发环境,有的小 ...
- ES6新增常见特性
一:声明属性let const var let const 区别 1.var声明变量会发生变量提升,let.const不会发生变量提升 2.var允许重复声明变量,let不可以 3.const声明变量 ...
- charles SSL代理设置
本文参考:charles SSL代理设置 charles SSL代理设置 SSL Proxying Srtting 这里最常用的设置就是第一个ssl proxying,这里记录了需要捕获哪些ssl的信 ...
- Day 24 定时任务
1.什么是crond crond 就是计划任务,类似于我们平时生活中的闹钟,定点执行. 2.计划任务时间管理 1.Crontab配置文件记录了时间周期的含义 vim /etc/crontab * 表示 ...
- 公众号第三方授权 以及微信H5支付(前端)
由于公司业务需要,想用户通过我们公众号平台支付的金额直接进去用户自己的账户,所以涉及到公众号第三方授权: 由于涉及第三方,故需要在微信开放平台创建第三方平台: 创建第三方平台:(申请页面链接:http ...
- Mysql高手系列 - 第13篇:细说NULL导致的神坑,让人防不胜防
这是Mysql系列第13篇. 环境:mysql5.7.25,cmd命令中进行演示. 当数据的值为NULL的时候,可能出现各种意想不到的效果,让人防不胜防,我们来看看NULL导致的各种神坑,如何避免? ...
- Knative 实战:基于 Knative Serverless 技术实现天气服务-上篇
提到天气预报服务,我们第一反应是很简单的一个服务啊,目前网上有大把的天气预报 API 可以直接使用,有必要去使用 Knative 搞一套吗?杀鸡用牛刀?先不要着急,我们先看一下实际的几个场景需求: 场 ...
- java架构之路-(面试篇)Mysql面试大全
说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案. 1.索引是什么 ...