随笔分类 -  算法 - 搜索

1
摘要:嘴巴上把这道题切了,但是写代码的时候好多细节都需要注意. 1. 大概可以猜到能表示出的数字比多,但是这一步要用 BFS+hash 才行,因为用 DP 求解的话会有好多无用状态. 2. 做动态规划的时候如果对与状态有限制条件的话比较好写的方法是由合法状态去转移下一步,而不是枚举当前状态去找上一步的状态 阅读全文
posted @ 2020-04-02 09:45 EM-LGH 阅读(188) 评论(0) 推荐(0)
摘要:这个可以爆搜,如果搜出来环的话就一定不合法. 这个时间复杂度是 $O(n^4)$ 的. 但是我们发现,如果向右侧搜的话右侧许多方块会把很多状态都提前搜出来了. 所以我们可以从左向右枚举,搜左面.从右向左枚举,搜右面. 这样时间复杂度就是 $O(n^3)$ 的了. code: #include <bi 阅读全文
posted @ 2020-03-12 23:58 EM-LGH 阅读(187) 评论(0) 推荐(0)
摘要:简单记忆化搜索. 显然,数字的形态是类似阶梯下降的,状态数不会太多,记忆化爆搜就行. code: #include <bits/stdc++.h> #define N 12 #define mod 1000000007 #define base 12 #define ll long long #de 阅读全文
posted @ 2020-03-09 22:19 EM-LGH 阅读(179) 评论(0) 推荐(0)
摘要:用 trie 搜索一下就好了. code: #include <bits/stdc++.h> #define N 10008 #define setIO(s) freopen(s".in","r",stdin) using namespace std; char S[24]; int trie[N* 阅读全文
posted @ 2020-02-11 11:07 EM-LGH 阅读(169) 评论(0) 推荐(0)
摘要:推式子没推出来什么特别有用的结论. 看题解后发现这尼玛就是一个大爆搜啊. 以后碰到这种推式子推不出来,或者没啥思路的时候可以考虑爆搜解决. code: #include <cstdio> #include <string> #include <cstring> #include <algorithm 阅读全文
posted @ 2019-12-26 16:46 EM-LGH 阅读(122) 评论(0) 推荐(0)
摘要:考试 T2,没想到真的就是一个大爆搜啊~ 搜索时几个剪枝: 1.剩余可用颜色要大于等于剩余步数 2.颜色从没用过的里找,然后用二进制状压存储. 3. 最重要的一个剪枝:如果一个颜色在之前序列中未出现过,且在之后的位置也不会强制出现,则所有这种情况的贡献都是相同的,只需算第一次的贡献,然后后面的依次累 阅读全文
posted @ 2019-10-29 14:31 EM-LGH 阅读(172) 评论(0) 推荐(0)
摘要:由于上下走不限制,所以按照贪心,我们应该尽可能走上下方向. 我们可以开一个双端队列,并认为每次提取队首的时候得到的是到达该点的最优策略.(这个一定是唯一的,因为不可能向右走几格,然后再退回去. ) 那么如果向上下走是不损失的,所以将上下的格子推进队首,优先扩展,然后将左右推进队尾,最后扩展. 这个贪 阅读全文
posted @ 2019-07-29 14:12 EM-LGH 阅读(137) 评论(0) 推荐(0)
摘要:Code: 阅读全文
posted @ 2019-07-23 16:32 EM-LGH 阅读(148) 评论(0) 推荐(0)
摘要:题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码。如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的。现在委员会已经找出了所有的病毒代码段,试问,是否存在一个无限长的安全的二进制代码。 示例: 例如如果{011, 11, 00000}为病毒代码段,那 阅读全文
posted @ 2019-06-10 15:01 EM-LGH 阅读(172) 评论(0) 推荐(0)
摘要:题目描述: 对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。 现在给定一个数N,你能求出不超过N的最大的反质数么? 题解: 显然,我们要求的是 $[1,N]$ 中 阅读全文
posted @ 2018-11-01 18:38 EM-LGH 阅读(186) 评论(0) 推荐(0)
摘要:hdu有毒,考试上 AC 的就是一直 WA…其实这道题是可以进行初始化来进行优化的,这样的话询问次数是可以达到 10510^5105 的。不过普通的 dfsdfsdfs + 剪枝也是可过的。Code:#include#include#includeusing... 阅读全文
posted @ 2018-10-10 12:54 EM-LGH 阅读(150) 评论(0) 推荐(0)
摘要:题解:首先,我们可以用 dfsdfsdfs 在 O(n)O(n)O(n) 的时间复杂度求出初始状态每个点的权值。不难发现,一个叶子节点权值的取反会导致根节点的权值取反当且仅当从该叶子节点到根节点这一条链上的每个点的权值都被取反(都被影响到)。而这4种逻辑运算... 阅读全文
posted @ 2018-10-03 11:26 EM-LGH 阅读(178) 评论(1) 推荐(0)
摘要:题目简单,不多解释。Code:#include#includeusing namespace std;const int maxn = 1000000 + 3;int head[maxn], to[maxn], nex[maxn], cnt, dep[max... 阅读全文
posted @ 2018-10-02 15:03 EM-LGH 阅读(126) 评论(0) 推荐(0)
摘要:Code:#include#include#includeusing namespace std;const int maxn = 200000 + 3;int head[maxnQ;inline void add_edge(int u,int v){ ... 阅读全文
posted @ 2018-09-26 19:52 EM-LGH 阅读(185) 评论(0) 推荐(0)
摘要:写了一下午,终于AC了。 由于n #include#include#include#include#includeusing namespace std;;const int n = 7;const int m = 5;int bo... 阅读全文
posted @ 2018-08-26 20:43 EM-LGH 阅读(151) 评论(0) 推荐(0)
摘要:我们可以发现最多只会进行5次操作。 由此我们从双向跑dfs,用一个unordered_map来保存状态,枚举一下两边的深度即可。 如果4次仍然不可行,则只有可能是5次。所以正反最多只需要搜2层 code:#include#include#include#in... 阅读全文
posted @ 2018-08-26 15:47 EM-LGH 阅读(151) 评论(0) 推荐(0)
摘要:显然,n#include#include#includeusing namespace std;const int maxn = 2002;int ans,n,target,sumv, w[30];bool f[maxn], mark[30];inline ... 阅读全文
posted @ 2018-08-25 16:11 EM-LGH 阅读(222) 评论(0) 推荐(0)
摘要:玄学剪支,正好复习一下搜索 感觉搜索题的套路就是先把整体框架打出来,然后再一步一步优化剪枝 1.从maxv到sumv/2枚举长度(想一想,为什么) 2. 开一个桶,从大到小开始枚举 3. 在搜索中,枚举到长度为x的木棍,则下一步也从x开始枚举 4. 如果当前... 阅读全文
posted @ 2018-08-25 14:37 EM-LGH 阅读(121) 评论(0) 推荐(0)
摘要:不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的。否则,中间那些没被覆盖的部分永远都不能被覆盖到。 当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的。我们可以开一个mark数组来记录每个城市是否被覆盖过,如果有没被覆盖到... 阅读全文
posted @ 2018-08-25 09:48 EM-LGH 阅读(151) 评论(0) 推荐(0)

1