如果想了解更多内容,欢迎关注我的微信公众号:信息学竞赛从入门到巅峰。

上期,我们讲解了解决动态规划的基本步骤,分别是:设置状态、枚举子问题,更新答案

其实,这每一步都不是那么好做到的,需要有足够的经验和相关数学知识来得出并化简动态转移方程,这对入门选手是很不友好的。

今天,我来介绍一种秒解DP的方法,适合入门选手快速熟悉动态规划问题,并逐步积累经验。

他就是——

搜索!

搜索!

搜索!

你可能会好奇:动态规划思想不就是要解决搜索算法时间复杂度过高的问题吗?这里怎么反而用搜索来解决动态规划问题了呢?

当然,这里的搜索并不是普通的搜索,而是记忆化搜索。

我们还是用01背包问题为例子,来讲解一下记忆化搜索的原理和实现方法。

搜索程序显然是很容易就能写出来的,核心代码如下:

这段代码中,step表示当前处理到那个物品,v表示背包已用的容量,sum表示当前背包内物品总共的价值。搜索过程分当前物品选或不选进行递归。

这代代码的时间复杂度是O(2^N),显然很难接受。

这时候,我们可以换一个搜索思路,把尾递归换成首递归。

参考一下代码:

这段代码也是很好理解的,step表示当前处理的物品,v表示当前背包剩下的容量。

但是,这么修改后时间复杂度也是O(2^N)的,并没有优化,怎么办呢?

我们观察代码,发现每层循环的自变量是step和v,因变量是返回值tmp。很显然,一旦step和v确定了,返回值tmp也就确定了。

这么说来,我们是不是开一个二维数组把tmp的值存下来,就只需要计算一次就好了,省事。

核心代码如下:

注意,f数组的初值为-1。

那么,这么处理后,代码的时间复杂度还是O(2^N)吗?

我们发现,如果f[step][v]不是-1(也就是已经得出了应该的返回值是),就会直接返回,不会再继续递归。那么,最坏情况下就是把f数组的每个值都算出来罢了。时间复杂度为O(NV),和用for循环实现的时间复杂度是一样的,但由于搜索需要递归压栈,可能常数会大一点。

记忆化搜索解决动态规划问题是很容易理解的。我们只需要按照写搜索的方法先写一个程序,然后找到自变量(其实就是递归参数)和因变量(每一层递归的返回值),就能快速实现记忆化搜索的程序。

【基础】秒解DP神器,你值得拥有相关推荐

  1. 【云原生之k8s】k8s基础详解

    [云原生之k8s]k8s基础详解 前言 一.kubernetes介绍 (1)kubernetes简介 (2)应用部署方式的演变 二.kubernetes组件 (1)kubernetes架构 (2)ma ...

  2. 3秒解一元二次不等式

    前言 这是我第一次在CSDN上发表文章,可能我学识尚浅,可能你会对我的文章内容的严谨性.准确性产生质疑.但我想说的是:我和你一样,满怀着对知识的热爱与渴求.在这里,我把自己闲暇时写的一些东西拿出来分享 ...

  3. 主线剧情03-NXP-i.MX系列的u-boot移植基础详解

    u-boot 移植基础详解 本文系广泛撷取.借鉴和整理(相关的内容在网络上有很多,但很多相互抄,或者是版本太老,或者就是不通用的非常有平台针对性的步骤,碎片化泛滥,甚至就是有待分拣的垃圾厂,当然也有一 ...

  4. BIOS设置基础详解

    BIOS设置基础详解AMI BIOS设置 开机显卡自检测完成后,点击<DEL键>即可进入AMI BIOS SETUP设置界面主菜单. 进入了AMI BIOS NEW SETUP UTILI ...

  5. c 语言中 %是什么运算符,C 语言基础----详解C中的运算符

    C语言中又有哪些运算符呢? 如下所示: ※ 算术运算符 ※ 赋值运算符 ※ 关系运算符 ※ 逻辑运算符 ※ 三目运算符 C语言基本算术运算符如下表: 除法运算中注意: 如果相除的两个数都是整数的话,则 ...

  6. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  7. 微信小程序详解 php,微信小程序canvas基础详解

    canvas 元素用于在网页上绘制图形.HTML5 的 canvas 元素使用 JavaScript 在网页上绘制2D图像.本文主要和大家分享微信小程序canvas基础详解,希望能帮助到大家. 一.了 ...

  8. 线程状态,优先级,守护线程基础详解

    线程状态,优先级,守护线程基础详解 线程状态 停止线程 线程休眠 线程礼让 线程强制执行 线程状态检测 线程的优先级 守护线程 线程同步 线程状态 创建状态(new 之后就是创建状态 就绪状态(调用s ...

  9. f**k命令(解压神器)

    文章目录 what the fuck 软件 安装 配置 what the fuck 今天介绍给大家一款解压神器: The FUCK linux命令敲错? fuck 重写依然错误? fuck 权限不够? ...

最新文章

  1. nutch-site参数配置
  2. 快做这 15点,让 SpringBoot 启动更快一点!
  3. 用户视角看百度移动:从流量集散地到流量目的地
  4. Python实训day02am【列表、字符串、字符集】
  5. 如何下载EP的各个版本?
  6. 检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为【经典】模式)。 - CatcherX...
  7. 201604-1折点计数
  8. 神经网络图用什么软件做,图神经网络 图像处理
  9. 中英文 织梦 html5,织梦dedecms如何做中英文多语言站点
  10. 软件考试(一)计算机技术与软件专业技术资格(水平)考试(以下简称软件水平考试)含金量最高,与职称挂钩。
  11. 用计算机绘图的注意事项,计算机绘图实践心得.doc
  12. 每一个被别人吃得死死的人,其实是…
  13. TCP/IP协议详解(TCP/IP protocol)
  14. Ubuntu14.04 安装 Python3.6
  15. DSP6678 RapidIO基本原理之一
  16. DjangoMTV学习1
  17. 泛生子Q3财报解析:癌症基因检测行业已呈现“燎原之势”
  18. 【计算机视觉】局部图像描述子:SIFT算法
  19. Layui弹出层的三项选择
  20. python 找到两个排序数组的中位数_4. 寻找两个有序数组的中位数(Python)

热门文章

  1. ZBrush快捷键与鼠标操作
  2. html,css笔试题分享(2)
  3. 电商控价,为什么要找控价公司
  4. andorid上部署dropbear服务
  5. 手机游戏蓝牙耳机哪个好?LOL游戏耳机推荐
  6. 移民局暂停H1B transfer 加急,特殊时期如何自救?
  7. 长亭社区版WAF部署(开源)
  8. ROS中Mangle解析
  9. 信创大数据平台容灾项目
  10. 机器学习-最大熵模型