搜索法有3种穷举法(结出所有解,进行判断是否满足给定约束),深度优先搜索和宽度优先搜素。深度优先搜索思想?给定图G=(V,E)。深度优先搜索思想:初始时,所有顶点均未被访问过,任选一个顶点v作为源点。该方法先访问源点v,并将其标记标记已访问过(通常用数组visit[i]的值..
分类:
其他好文 时间:
2016-09-01 16:33:15
阅读次数:
164
输入一个数组,求所有子集 也是选择问题,在上一题的基础上枚举子集长度,然后dfs+回溯选择。同样注意去重 ...
分类:
其他好文 时间:
2016-08-31 00:53:36
阅读次数:
174
输入n和k,求1~n中任选k个数的所有组合 这题是选择不是排列,所以用dfs+回溯 还是那个问题——去重:想象一颗树,每一层相同的元素只搜索一次,下次若同一层这个元素已经做过了就跳过,具体看代码 ...
分类:
其他好文 时间:
2016-08-31 00:31:31
阅读次数:
145
输入一个数组和target,选择任意个数的元素,求和为target的组合,每个元素可以选择多次 dfs,回溯,因为每个元素可以选择多次,所以向下搜索的时候从当前元素开始 同类题:http://blog.csdn.net/AC_0_summer/article/details/48293581 ...
分类:
其他好文 时间:
2016-08-30 13:26:41
阅读次数:
140
输入一个数组,选择任意个数的元素,求和等于target的所有组合,每个元素只能选择一次,组合不能重复 求组合:先排序,dfs,回溯 去重:把dfs想象成一颗树,同一层如果元素值相同,那么只对第一个元素深搜,其余相同的元素不必深搜,注意是同一层,看代码注释 ...
分类:
其他好文 时间:
2016-08-30 13:24:49
阅读次数:
138
#include<stdio.h>int a[100],b[100]={0},m,n;bool p(int k)//定义一个bool类型函数 ,用来判断 { if(b[k]==1) { return false; } return true;}void s(int k)//定义一个函数,用来回溯; ...
分类:
其他好文 时间:
2016-08-28 16:25:06
阅读次数:
137
Referred from http://blog.csdn.net/yapian8/article/details/28240973 分治算法 一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成 ...
分类:
编程语言 时间:
2016-08-27 23:30:02
阅读次数:
273
$dfs$,优化。 $return$操作说明该操作完成之后的状态和经过操作$k$之后的状态是一样的。因此我们可以建树,然后从根节点开始$dfs$一次(回溯的时候复原一下状态)就可以算出所有状态的答案。 对于$1$和$2$操作,可以开一个数组$a[i][j]$记录每一格子被操作$1$和$2$操作了几次 ...
分类:
其他好文 时间:
2016-08-27 22:01:36
阅读次数:
152
经典问题。强制在线的话非常复杂。 考虑离线。 每条边的存在时间是一个区间,因此按时间建立一颗线段树,将每条边插入,拆成log条边。然后dfs线段树,每次并查集合并当前节点的所有边,到叶子节点时回答询问,回溯时撤销并查集的修改。 带撤销的并查集不能路径压缩,要按秩合并。 ...
分类:
其他好文 时间:
2016-08-27 21:55:50
阅读次数:
155
1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术 ...
分类:
其他好文 时间:
2016-08-27 06:23:04
阅读次数:
154