搜索
2020100XWH
这个作者很懒,什么都没留下…
展开
-
搜索问题呀
搜索复杂度估计:状态数*状态转移(因为会记录下已经搜索过的状态,防止重复搜索)输出路径的时候需要递归输出,这里将这些所有信息包含一个结构体中方便输出#include<bits/stdc++.h>using namespace std;struct one{ int now; int last; int pos; int way; int step;};one a[1<<16];bool vis[1<<1..原创 2022-04-26 11:15:00 · 82 阅读 · 0 评论 -
数学递推式(参入数论)
问题:在1e9内所有素数中放回抽取,直至累乘积为目标值,求期望抽取次数递推公式(有回退性):记f[x]表示目标值为x时的期望次数f[x]=1+(( f[ x/prime[i] ]*p[i] )+f[x]*pp )得到x的期望等于这次没抽到x素因子的概率乘期望+抽到概率*剩余期望+1(这一次的递推)这里pp为定值,移项化简得到递推,递推特征是子状态的素因子一定在x中,记录所有素因子,然后每次枚举其素因子可重复的个数即可,这种没那么规整的递推多使用记忆化搜索,用个数组记录即可原创 2022-04-26 11:09:02 · 94 阅读 · 0 评论 -
记忆化搜索
dp动规思想结合搜索,再搜索的过程中对搜索到过的最优子结构进行记录,当下次再递归搜索到时直接访问停止递归,以防止重复的拓扑搜索。记忆化搜索是对dp的扩充,当dp情况多样难以枚举时,可以考虑结合搜索处理[SHOI2002]滑雪 - 洛谷#include<iostream>#include<cstring>#include<vector>#include<cstring>#include<cmath>#include<原创 2022-04-19 17:06:52 · 100 阅读 · 0 评论 -
链的特征,点的度数小于等于2
1.深搜遍历一个图 当前+上一个(防止回头)2.题设未强调不重复,则可以3.需要顺序则需id4.auto i 为内容整体Problem - C - Codeforces#include<bits/stdc++.h>using namespace std;int n,t,xx,yy;struct edge{ int id,v;};vector<edge>a[100005];int ans[100005];void dfs(in...原创 2022-02-17 22:29:23 · 221 阅读 · 0 评论 -
问题转补)(转化为搜索)
给一个图,前提只有一个完整的障碍圈,要求找到并标记所有圈内的位置可转换为问题的补问题,直接广搜圈外的位置,遇到障碍不走,圈内的位置全被障碍挡住也走不过去标记完圈外的位置,剩余没标记的除去障碍的位置就是要标记的圈内部位置广搜小tips:当没给明显起点时,可以在外部加一圈(整一圈)合法的,防止随便选取的为不合法的点影响广搜#include<bits/stdc++.h>#define pii pair<int,int>#define aa first#defin原创 2021-09-28 17:08:25 · 252 阅读 · 0 评论 -
自然数字典序分解)
本质即深搜找所有符合条件的路径1.条件,将n分解为至少两个数相加,条件为前面的 数小于后面的数2.用数组记录先后出现的数,只要满足后一个大于等于前一个就满足,一条路径结束的标志为要分解的数为0,所以每次传入 要分解的数,和前一个数下标3,每次加回那个数使得回溯再找,每次也已从前面的数到sum分解(注意分解出的数要小于总的n防止只有一个)#include<bits/stdc++.h>using namespace std;int a[10]={1},n;void prin.原创 2021-09-28 15:19:09 · 89 阅读 · 0 评论 -
单词接龙(字符串前后拼接)
题意理解:要求最长,所以重叠部分最短(可能可重叠更长)(因为最多两次,可连自己)问题化归:可以通过把最后一个前面加个空格来划归到求最短重叠部分开启计算最短重叠部分的逻辑也要清晰,不能包含直接限制在循环控制在最小的长度内长了的直接标0等于没找到(函数思想简化)限制只在于每个使用次数小于等于两次 而且也没有结束的标志 所以只要在所有的dfs限制次数即可,因为没有结束标志而要的是所有最大,所以按时更新维护最大即可#include<bits/stdc++.h>using na.原创 2021-09-26 23:03:35 · 197 阅读 · 0 评论 -
bfs+标记+dfs(搜索所有路径)
迷宫 - 洛谷#include<iostream>#include<cstring>#include<algorithm>#include<math.h>#include<cmath>#include<vector>#include<queue>#include<set>#include<map>#include<cstdio>#include<string原创 2021-09-26 16:06:53 · 79 阅读 · 0 评论 -
卡时懵剪搜索小技巧)
#include<bits/stdc++.h>#define pii pair<double,double>#define aa first#define bb secondusing namespace std;int n;int l;pii a[20];double dis[20][20];double ans;bool kk[20];bool cmp(pii a1,pii b1){ return (a1.aa*a1.aa+a1.bb*a1.bb)&l.原创 2021-09-22 23:10:01 · 65 阅读 · 0 评论 -
dfs流程)
参数:当前状态+目标量(如步数)1.判结束(防止开始即结束)2.dfs一般为最优,所以判断当前目标量若已经不是最优了就直接return,防止没结束的状态(非至目标)对结果影响3.标记vis防一条路径徘徊4.按方向搜索5.回溯#include<bits/stdc++.h>using namespace std;bool vis[300];int a1[300];int n;int a,b;int ans;void dfs(int x,int cnt)//.原创 2021-09-21 22:12:07 · 133 阅读 · 0 评论 -
bfs减代码量)宽距
#include<bits/stdc++.h>using namespace std;#define pii pair<int,int> #define aa first #define bb secondint dx[8]={2,2,1,1,-1,-1,-2,-2};int dy[8]={1,-1,2,-2,2,-2,1,-1};//定义方向,几维度用多大的数组对应几个方向,搜索方向,简化代码量 int n,m,x,y;int mp[500][500];void.原创 2021-09-21 21:17:18 · 30 阅读 · 0 评论 -
递归)=同➕异
此处作图,同的是相对的形,异的是顶点坐标https://www.luogu.com.cn/problem/P1498#include<iostream>#include<cstring>#include<algorithm>#include<math.h>#include<cmath>#include<vector>#include<queue>#include<set>#includ.原创 2021-09-16 08:55:58 · 45 阅读 · 0 评论 -
递归填图)图形规律
地毯填补问题 - 洛谷每次选取有公主的四分之一方格填另外三个,划归出三个边角放置公主的情况,再分别递归,可由小递归到大,公主格可扩充到含公主的格子,空格也可扩充到全空的格子!注意坐标方向所给,按所给来,变换容易出bug#include<iostream>#include<cstring>#include<algorithm>#include<math.h>#include<cmath>#include<v..原创 2021-09-16 01:01:47 · 40 阅读 · 0 评论 -
翻转coin)//位运算
异或0等于自己异或自己等于0所以异或奇数次等于自己,偶数次等于0;题意即可转换为所有数都用奇数次然后各个结果异或起来即为整个异或,一个操作改变一次奇偶性。等价于全部向下的coin每次对不同的k个coin翻转,使全部向上这里忽略下标直接考虑两个无序队列,奇和偶,每一步翻转k个,从奇中翻转i个,偶中翻转k-i个得到新的状态,dp【i】为i个为奇时最小的步数(不一定连续),由此bfs搜索,并用path【】记录路径;路径记录的是传到此位置的原奇数个,算出last到now的差从两个队列中pop和pus原创 2021-09-14 14:43:36 · 49 阅读 · 0 评论 -
错误假设+正确推理=错误结论
1.使用memset初始化一定要慎重,一般只用来初始化0、-1、0x3f这几个数字,其他的建议使用循环初始化,其他值尽量用for循环吧。2.作为无穷大,一个数除了要保证足够大外,还要保证不能溢出。使用0x3f3f3f3f作为INF主要原因是,两个0x3f3f3f3f的和只比int类型的最大值小一点,这样既能保证一般情况下的足够大,在两个无穷相加时还能够保证不会溢出++ primer中sizeof 的解释如下:1.对char或值为char类型的表达式做sizeof操作得12.对引用类型做操作.原创 2021-09-03 07:02:47 · 258 阅读 · 0 评论 -
暴力深搜(暴力角度)
hdu 1560 序列公共组合问题若从各序列出发不易找到主动的组合方法所以可以从结论序列的长度和各位置身份出发深搜(每个都尝试)单线路尝试找到最短即出(反向考虑)IDA* 深度为目标序列长度 最佳覆盖为估值函数#include<bits/stdc++.h>using namespace std;struct one { string s; int len; int now;}a[10];int n;int depth;string c="ACGT";int原创 2021-07-29 18:27:14 · 141 阅读 · 0 评论 -
IDA*加深搜总结
深搜总结:1.判定状况模块(找目标特征,补充估价函数等)2.变化模块(单步变化及回退)3.退出深搜(找到目标后,除了退出目标情况外还要退出并行的状态发展)4.迭代深搜(逐层推进)5.逐层深搜后记得恢复所需的原状态进行退回再探#include<bits/stdc++.h>using namespace std;int maxBlock,blockNum,flag,ans[50],step;int row1[7],row2[7],line1[7],line2[7];原创 2021-07-28 17:09:36 · 60 阅读 · 0 评论 -
连连看(路径加特征深搜)
#include<bits/stdc++.h>using namespace std;int n,m,f;int cnt;int last;int a[1005][1005];bool b[1005][1005];bool c[1005][1005];int dir[][2]={{1,0},{-1,0},{0,1},{0,-1}};bool check(int x,int y){ if(x>=1&&x<=n&&y>=1&a.原创 2021-07-28 14:12:41 · 96 阅读 · 0 评论 -
涂色问题(搜索+四色剪枝)
#include<iostream>using namespace std;typedef class { public : int next[27]; int po;}point;//数字标记节点和颜色种类,一个节点的数据类型包括相邻节点名称和相邻总结点数 int main(){ int n; while(cin>>n&&n) { getchar (); point *node=new point[n+1]; for(int.原创 2021-07-28 10:35:37 · 121 阅读 · 0 评论