递归值函数调用自身;

一、DFS的介绍

  • 概念很简单,但是还是得了解一下,下面介绍的内容是重点

1. 图的DFS

(1)先看一下vector是怎么建图的?

vector<int> vecMap[100010];// n条边(这个结点所连接的结点) 邻接表建图
for (int i = 0; i < n; ++i) {int x, y;vecMap[x].push_back(y);vecMap[y].push_back(x); //若是无向图就加上这一句
}

(2)图的DFS实现模板

// 假设这是个无向图
// 这里用DFS搜索所有的点(不是边)
// x代表搜到的当前的点
// 开一个搜索数组(标记)搜到为1,未搜到为0
int visited[100100];
void dfs(int x) {int i;visited[x] = 1; // 访问到了当前这个点,要标记为1,否则会陷入死循环for (i = 0; i < g[x].size(); ++i) {if (!visited[g[x][i]]) {// 若这个点的邻接点没有访问过(能走)就往这个邻接点走(递归这个邻接点)// 中间可以做一些其他的操作dfs(g[x][i]);}}   }
  • 比如连通块问题;
  • 树形DP

(3)树的DFS实现模板

树(边数 = 顶点数 - 1 的图)的DFS
- 关于树,它是一个很特殊的图;
- 树更直观,它有层次有深度,也就是说
- 只要我们搜索的时候,搜到的不是该结点的父节点,那么就意味着我们没有搜过这个点
- 那我们就可以不用开标记数组了,在每一个递归的时候,把父节点一起传进去
- pr :父节点,也可以说是这个结点的前一个结点
void dfs(int x, int pr) {// x为当前传入的结点for (int i = 0; i < g[x].size(); ++i) {if (g[x][i] != pr) dfs(g[x][i], x);}
}

二、使用DFS代替状压枚举:

1. 数位染色DFS写法

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll sum;
ll x;
int getSum (ll x) {int res = 0;while (x) {res += x % 10;x /= 10;}return res;
}
int judge = 0; // 找到一个方案数,正好染色的数字之和等于总和的一半,就为true //x 代表当前这个数字(后面几个已经选过了,还有哪些位置还没有选,
//tmp 代表选了后面几位,我会选到什么 (已经选到的数字的和)
void dfs(ll x, ll tmp) { //12345 取 13if (x == 0 || tmp * 2 >= sum) {if (tmp * 2 == sum) {judge = 1;}return ;}//    当前x%10的数不取,直接到下一个数dfs(x / 10, tmp);
//  当前x%10的数取dfs(x / 10, tmp + x % 10);}
int main () {cin >> x; // 输入的数字sum = getSum(x); // 求位置上的数字的和 dfs(x, 0);if (judge) cout << "Yes";else cout << "No";return 0;
}

2. 记忆化搜索

记忆化搜索,指通过记录已经搜索到的值来降低重复操作次数,从而加快运行速度。用空间换时间;
拿个数组给它记录过程中的中间值

(1)举个例子:斐波那契数列

  • 普通递归:O(2^n)
int f(int n) {if (n <= 1) return 1;return f(n - 1) + f(n - 2);
}

记忆化搜索:O(n): 在搜索的过程中,把计算过的值用数组或STL容器存储下来,减少重复搜索的时间;这样遇到这个数就可以直接返回其值了

ll dp[100010] = {0};
ll f(ll n) {if (n <= 1) return dp[n] = 1; //赋值后将这个值返回if (dp[n]) return dp[n]; // 若记忆数组中有值,就把它返回return dp[n] = f(n - 1) + f(n - 2);
}

三、分治

将问题拆分成子问题进行求解。例如:归并排序

常用的递归算法:dfs(深度优先搜索),记忆化搜索,分治相关推荐

  1. 动态规划+深度优先搜索+记忆化搜索(干货满满)

    动态规划的定义 动态规划算法与分治法的思想类似,都是通过组合子问题的解来求原问题.我先来给大家介绍一下分治思想,分治思想就是把一个复杂的问题,分解为k个规模相同的子问题,如果还是无法解决,子问题又可以 ...

  2. 【蓝桥杯真题】地宫取宝(搜索-记忆化搜索详解)

    链接 [蓝桥杯][2014年第五届真题]地宫取宝 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被 ...

  3. 习题9-2(免费糖果)【深搜dfs】+【记忆化搜索】

    习题9-2 [UVa 10118]Free Candies(免费糖果) 题目大意: 桌上有4堆糖果,每堆有N(N<=40)颗.佳佳有个最多可以装5颗糖果的小篮子.他每次选择一堆糖果,把最顶上的一 ...

  4. 山东省第五届省赛题C Colorful Cupcakes(五维数组+记忆化搜索)

    在写题目之前先来介绍一下记忆化搜索. 算法上依然是搜索的流程,但是搜索到的一些解用动态规划那种思想和模式保存.一般来说,动态规划总要遍历所有的状态,而搜索可以排除一些无效的状态.最最最最最主要的是,搜 ...

  5. ZOJ - 2972 Hurdles of 110m(记忆化搜索/动态规划)

    题目链接:点击查看 题目大意:给定n个点,以及m的最大体力值,共有三个状态通过每个点 快速模式:消耗时间t1,消耗体力f1 匀速模式:消耗时间t2 慢速模式:消耗时间t3,恢复体力f2 问:通过n个点 ...

  6. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  7. 博弈论 (入门)CSU2209 记忆化搜索

    2209: Game Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 256 Mb     Submitted: 10    ...

  8. 记忆化搜索 Memorization Search

    记忆化搜索 Memorization Search 什么是记忆化搜索 记忆化搜索函数的三个特点 记忆化搜索 vs 动态规划 三种适用于DP的场景 三种不适用于DP的场景 Examples: Leetc ...

  9. lcDFS1 深度优先遍历1[记忆化搜索]

    1 深度优先遍历 最常见的优化: 1 记忆化搜索: 使用hash记录遍历起点对应的值,然后直接从hash中获得,避免重复计算 2 常见算法: 对于欧拉图和半欧拉图算欧拉路径:hierholzer算法 ...

最新文章

  1. 【错误记录】Android Studio 编译时 Kotlin 代码编译报错 ( 升级支持库时处理 @NonNull 参数 )
  2. Python成长之路第二篇(3)_字典的置函数用法
  3. Spring4.X系列之Spring JDBC
  4. python tcl 控件_在Tkinter.Tcl()中使用Python函数
  5. android各种color值
  6. Django之ORM
  7. C语言第一节 C语言程序与开发工具
  8. what's new in vs 2005
  9. python def函数报错详解_python自定义函数def的应用详解
  10. 51CTO独家:2008下半年软考所有科目试题已到
  11. 【BZOJ】【2730】【HNOI2012】矿场搭建
  12. 《统计学》第八版贾俊平第七章知识点总结及课后习题答案
  13. RC电路延时公式推导
  14. 2022前端HTML5面试题
  15. 《炬丰科技-半导体工艺》采用湿法工艺制备的具有自洁表面的黑硅
  16. MySQL数据导入导出方法与工具介绍
  17. 苹果电脑传android文件怎么打开,怎么用苹果电脑给android手机传文件
  18. 通俗说法+专业解释,载波聚合
  19. 随机生成1万个随机姓名与密码存入txt文本中
  20. java -jar xx.jar是如何运行的

热门文章

  1. 张德芬《遇见未知的自己》--书评加读书笔记
  2. 中国科学十大进展发布,有你单位的成果吗?
  3. 名帖79 苏轼 楷书《醉翁亭记》
  4. FastReport.Net FastReport.Core 2023.2.23 Crack
  5. 30分钟玩转Python后端Flask
  6. WIN32 消息Hook API
  7. 共享万物互联新生态 2017第二届eSIM技术与创新峰会圆满落幕
  8. Java应用云原生构建优化
  9. 分区保存分区表时,出现保存分区表错误(00000001,函数不正确)
  10. matplotlib-21 stackplot堆积折线图