dfs 感悟

感悟:
1.    什么时候用排列组合问题?
看看结果有ArrayList?
所求的容器有多个结果值-且各个结果值之间只是顺序,或长度不同,但是来源(存在有显性隐性输入值)都是一样的-- 正是排列组合的根本.
数组, 字符串
2.    关键点:
递归函数里面加入容器, 结果值--操作的元素---不断地操作结果中的值, 输入值, (判断访问过没有—看是否要求重复、位置计数器)。
3.    二叉树的回溯法有单独的模板

5.10
4.    //元素没有重复
           if (list.contains(nums[i])) {
               continue;
           }
5.    元素有重复必须先sort,且要求递增顺序
for (int i = pos; i < nums.length; i++) {
            //画图得到必须要跟前一个节点的值不同并且不是第一次循环进入的点(不然会空指针异常, 或者同一层次(pos进入)的点,       即同一个递归函数不能跟后面的值一样)

            if (i != pos && nums[i] == nums[i-1]) {
                continue;
            }

6.    元素有重复必须先sort,且答案之一的顺序无要求。

for (int i = 0; i < nums.length; i++) {
            //保证当前元素递归到下一次 时不再次访问
if (visited[i] == 1)  {
                continue;
            }
              //保证兄弟元素重复的在同一层次不再被访问, 取出同一层相同的答案
            if (i > 0 && nums[i - 1] == nums[i] && visited[i - 1] == 0) {
                continue;
            }

7.    在pos 处一点猫腻
for (int i = start; i < s.length() && i < start + 3; i++) {
            String item = s.substring(start, i + 1);
            if (isValid(item)) {
8.    什么时候用subString 和StringBuilder? 有固定的字符串的时候用subString, 如果没有单纯的添加单个字符而非字符串匹配类的问题用sb, 或者在构件好多个单词后,用sb添加拆分符号:
递归很重要
  递归过程根据题目要求画图来的
时间: 2024-11-05 13:41:50

dfs 感悟的相关文章

Graph 感悟

感悟: 遍历图上的点先想到宽度优先搜索, 有很多模板 关于图的: 都是宽度优先遍历, 只是对遍历又稍微加了点条件----用hashMap, [ ] ? [ ] [ ], ArrayList[] ?  来存储对应的条件, 对入队的点判断是否满足该条件,进行存储. 简单图求最短路用宽度优先搜索 关于找所有的情况: 一般用深度优先搜索 有向图: 入度和边, 用什么容器, 怎么生成图, 根据什么入队, 出队后怎么遍历其他的边, 并判断入队 题意的分解:拓扑排序,BFS 5.9: 图.节点 ---.nex

hdu 5325 Crazy Bobo dfs

// hdu 5325 Crazy Bobo // // 题目大意: // // 给你一棵树,树上每一个节点都有一个权值w,选择尽可能多的节点, // 这些节点相互联通,而且依照权值升序排序之后得到节点编号, // 需相邻节点之间的随意节点都要大于较小的节点. // // 解题思路: // 对于每一对u,v,我们建一条这种边:权值小的像权值大的连一条边. // 这样,问题就转化为求以u最小的权值为根的子树上点集的最大值. // dfs就可以. // // // 感悟: // // 多校的一道题目

Noip2017 感悟

虽然已经是一个星期多以后了,游记什么的就不写了,但还是补上感悟吧.第一次写,文笔不好请见谅. 今年的NOIP确实比较奇怪,题目有些比较简单,D1T1+D1T2+D2T1拿满分的话就能1=,但正如qyp学长所说,会做不一定能拿分. D1 T1是小学奥数题,a*b-a-b....或许是太简单了,许多学长和学姐都想偏了,没能拿满分.这个题确实很好,虽然代码简单,但考了很多内容,比如心态.有些人一看这个题,就想成是数论题:有些人一看数据范围,就想打高精度.但要是没做出来,心态就崩了一半.我当时也是犯了这

解救小哈——DFS算法举例

一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二.问题的分析 首先我们用一个二维数组来存储这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q).其实这道题的的本质就在于找从(1,1)到(p,q)的最短路径. 此时摆在小哼面前的路有两条,我们可以先让小哼往右边走,直到走不通的时候再回到这里,再去尝试另外一个方向. 在这里我们规定一

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间

uva1103(dfs)

UVA - 1103 还是没写好,,看的别人的 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <stack> 8 #include <cctype> 9 #include <str

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

蓝桥杯 大臣的旅费_树的最长度_两次DFS

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <functional> #include <vector> using namespace std; const int maxn = 1000000 + 10; const int INF = 10000000

A. The Fault in Our Cubes 暴力dfs

http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行,就会早早退出. 这样写起来比较好写. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <