算法总结-深搜 由于是深度优先,后进入的结点需要先读取,因此选取堆栈实现,在栈中保存从起始结点(状态)到当前结点的路径上的所有结点。一般用递归实现。 非递归框架 递归框架 在深度优先搜索中,状态空间的图结构并不一定需要显式地保存下来。 该做法需要一个全局数组array来存放每个走过的node,arr ...
分类:
编程语言 时间:
2019-06-19 17:23:36
阅读次数:
101
暴力枚举油滴的编号的排列(next_permutation),然后按序一个一个扩展。面积的求最小值即可。也可以深搜。 复杂度 $O(n!\times n^2)$. cpp include include include define sq(a) ((a) (a)) define PI 3.14159 ...
分类:
其他好文 时间:
2019-06-15 09:22:48
阅读次数:
118
一、简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过。所以大多数搜索算法都需要优化。形象地看,搜索的优化过程就像将搜索树上没用的枝条剪下来,因此搜索的优化过程又叫剪枝。剪枝的实质就是通过判断决定是否要沿当 ...
分类:
其他好文 时间:
2019-06-11 10:52:12
阅读次数:
98
之前做过不少深搜题,很多TLE,所以剪枝很重要,如何“未雨绸缪”,避免不必要的搜索树分支? 例题: 数的划分 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输出 ...
分类:
其他好文 时间:
2019-06-09 12:48:25
阅读次数:
102
深度优先搜索: dfs,运用递归函数,通过栈的结构进行搜索。 模板: ·dfs(状态) –if 状态 是 目标状态then ·dosomething –else ·for 每个新状态 –if 新状态合法 »dfs(新状态) ·主程序: ·dfs(初始状态) 广度优先搜索: bfs,运用递归函数,通过 ...
分类:
其他好文 时间:
2019-06-09 12:41:29
阅读次数:
104
众所周知,搜索是个好东西,他能在很多时候(就是你不会正解打暴力的时候)派上用场。 然而搜索的时间复杂度实在是太高了,大多数都是指数级别的,这让人很是头疼 那么我来总结一下对搜索进行优化的技巧:剪枝 什么是剪枝 我们知道,搜索的进程可以看做遍历一棵搜索树的过程。而所谓的剪枝,就是通过某种判断,避免一些 ...
分类:
其他好文 时间:
2019-06-08 11:39:33
阅读次数:
91
题目链接:https://ac.nowcoder.com/acm/contest/903/L 题意:给你 n * n的方阵,你可以从任意一个数字开始走,可以走上下左右四个方向,走过的数字会被拼合,拼合的数字没有前导0,问最小不能拼合出来的数字是多少? 思路:开始就认为是一道深搜题,后面自己想太多就没 ...
分类:
其他好文 时间:
2019-05-26 15:59:56
阅读次数:
105
题目链接:Prime Ring Problem 思路: 类似八皇后问题,做递归处理即深搜,注意状态变化即可 代码: ...
分类:
其他好文 时间:
2019-05-19 11:45:00
阅读次数:
138
/* 枚举素数幂p 然后求k^p60,所以最多容斥两次就可以 枚举pi最为起点进行深搜,只搜比pi大的 */ #include using namespace std; #define ll long long int p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,... ...
分类:
其他好文 时间:
2019-05-13 23:31:17
阅读次数:
200
一道深搜题 应该很早就做然而并没有 这跟成语接龙一点也不像不能为所欲为 然后需要注意一下 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过。 每个单词最多出现两次 这样提前先预处理一下每两个单词之间的重复部分 用sam[i][j]表示第i个单词后接第j个单词的重叠的部分 然后d ...
分类:
其他好文 时间:
2019-04-27 18:14:09
阅读次数:
152