利用Leetcode#198打劫家舍 浅谈动态规划

Origin:https://leetcode-cn.com/problems/house-robber/

  • 题目本身不难,就是一个动态规划的问题。在这里浅谈一下动态规划的精髓思想,适用范围。

  • 动态规划的定义大家在网上随便都可以搜到。但是我们要怎么理解和应用动态规划。即我们遇到问题的时候,要怎么才能“想到”动态规划呢?

    1. 可以将一个问题,拆分成几个子问题。

      • 这不废话吗?任何问题都可以拆分成很多个子问题,那凭什么动态规划那么牛逼呢?
    2. 解决这几个子问题,即可得到最终问题的解。
      • 那这是怎么实现的呢?
      • 例如,假设我要求f(n)的最大值,只需要知道f(n-1)和f(n-2)的最大值。
        • 于是,上面简简单单一句话,透露了动态规划的很多信息。

          1. f(n)只和f(n-1), f(n-2)的值有关系。
          2. 我们只关心数值本身,不需要详细的知道f(n)是怎么来的,简化思维过程。
  • 所以,由此可见,动态规划解题的性质即:把求解f(n)转换为求解与其相关的f(p)

  • 那么问题又来了,我如何判断一个问题能不能用动态规划解决呢?下面介绍两个概念

  • 无后效性

    • 定义:如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响。

    • 例如,求斐波那契数列第N项。我们都知道递归公式 f(n) = f(n-1) + f(n-2),那么我们求f(n)的所有所需条件就是知道f(n-1)和f(n-2),我们不需要知道。

      过去的内容不会影响将来的内容,这就是无后效性的本质。

  • 最优子结构

    • 这里用背包问题来讲解

    • 背包问题:有一个背包,他的容量为C(Capacity)。现在有n中不同的物品,编号为0…n-1,其中每一件物品的重量为w(i),价值为v(i)。问可以向这个背包中盛放哪些物品,使得在不超过背包容量C的基础上,物品的总价值最大。

    • 动态规划是解决背包问题最常用的方法,把问题的转态描述为:F(n,C)考虑将n个物品放进容量为C的背包,使得价值最大。

    • 而对于F(i,c),有两种情况,将第i个物品加入和直接忽略第i个物品

      F(i,C) = max{F(i-1, C), v(i) + F(i-1, C-w(i))}

      前者即为忽略第i个物品,后者即添加第i个物品。

    • 那么,这和最优子结构有什么关系呢?注意我们的定义,F(n,C)考虑将n个物品放进容量为C的背包,使得价值最大。不难发现,F(n,C)的定义已经是最大价值了,那么已经是当前小问题的最优解了。最终问题的最优解可以由小问题的最优解得到,这个性质叫做最优子结构

  • 只要一个问题有 无后效性 和 最优子结构,就可以用动态规划解决。

  • 那最后,我知道要用动态规划了,我要怎么设计呢?

    • 记住三个词语

      • 目标
      • 状态
      • 转移
    • 目标即我要干嘛?我要干嘛,在背包问题中,我要使一定容量的包装最值钱的东西。设这样的函数为 F(i, c)。
    • 状态即怎么描述当前的局面。对于任意一次拿物品,当前的背包还剩k空间,我们目标都是求得F(i, k)。
    • 转移是紧跟着状态的,找出F(i, k)与哪些局面有关系,记为p,写出状态转移方程,通过F(p)来求解 F(i, k)。

    转自知乎@阮行止

    设计DP算法,往往可以遵循DP三连:

      我是谁? ——设计状态,表示局面

      我从哪里来?

      我要到哪里去? ——设计转移

      设计状态是DP的基础。接下来的设计转移,有两种方式:一种是考虑我从哪里来;另一种是考虑我到哪里去,这常见于求出f(x)之后,更新能从x走到的一些解。这种DP也是不少的,我们以后会遇到。

浅谈动态规划(Dynamic Programming)的更多相关文章

  1. 动态规划Dynamic Programming

    动态规划Dynamic Programming code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路 理解动态规划: 递归与动态规划的联系与区别 -> 记忆化搜索 -& ...

  2. 6专题总结-动态规划dynamic programming

    专题6--动态规划 1.动态规划基础知识 什么情况下可能是动态规划?满足下面三个条件之一:1. Maximum/Minimum -- 最大最小,最长,最短:写程序一般有max/min.2. Yes/N ...

  3. 动态规划(Dynamic Programming)算法与LC实例的理解

    动态规划(Dynamic Programming)算法与LC实例的理解 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Le ...

  4. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  5. [算法]动态规划(Dynamic programming)

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4603173.html Dynamic Programming的Programming指的不是程序而是一种表格 ...

  6. 最优化问题 Optimization Problems & 动态规划 Dynamic Programming

    2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...

  7. 动态规划系列(零)—— 动态规划(Dynamic Programming)总结

    动态规划三要素:重叠⼦问题.最优⼦结构.状态转移⽅程. 动态规划的三个需要明确的点就是「状态」「选择」和「base case」,对应着回溯算法中走过的「路径」,当前的「选择列表」和「结束条件」. 某种 ...

  8. 动态规划 Dynamic Programming 学习笔记

    文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...

  9. Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...

随机推荐

  1. ffmpeg 编程常用 pcm 转 aac aac 转 pcm mp4 h264解码

    ffmpeg 是现在开源的全能编解码器,基本上全格式都支持,纯 c 语言作成,相对比其它的 VLC ,GStreamer glib2 写的,开发更简单些,文档很棒,就是 examples 比较少. 常 ...

  2. 学会了这些redis知识点,面试官会觉得你很nb(转自十年技术大牛)

    是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义.redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有数据类型的,只有把它们 ...

  3. button控件根据文本自适应

    2020-03-12 每日一例第5天 1.添加按钮1和label.textbox控件,并修改相应的text值: 2.修改textBox1的TextChanged事件并输入代码: button1.Tex ...

  4. 浅析js中的堆和栈

    这里先说两个概念:1.堆(heap)2.栈(stack)堆 是堆内存的简称.栈 是栈内存的简称.说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事.各种语言在处理堆栈的原理上都大 ...

  5. 基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现

    目录 1. 概述 2. 实现 2.1. 原理 2.2. 核心代码 2.3. 第二种优化 3. 结果 1. 概述 我在之前的文章<基于均值坐标(Mean-Value Coordinates)的图像 ...

  6. Java-字符输入输出(新手)

    参考手册: BufferedReader BufferedWriter: 关键字: close() 关闭流,先刷新.    newLine() 写一行行分隔符.    write() 写一个字符    ...

  7. 使用SpringBoot + JavaMailSender 发送邮件报错 Mail server connection failed;Could not connect to SMTP host

    说明: 出于安全考虑,阿里云默认封禁 TCP 25 端口出方向的访问流量,无法在阿里云上的云服务器通过 TCP 25 端口连接外部地址. [官方提示]:如果您需要使用阿里云上的云服务器对外部发送邮件, ...

  8. Red Team 工具集之网络钓鱼和水坑攻击

    来自:信安之路(微信号:xazlsec),作者:myh0st 参考项目:https://github.com/infosecn1nja/Red-Teaming-Toolkit 上图是一个 Red Te ...

  9. 微信小程序api封装

    写多 之后,吸取之前的经验,瞎写了一个简单的封装api,有幸看到的朋友,就随便看看哈,如果能给到你帮助就一直棒了,额呵呵呵! 新建constant.js和api.js文件 在constant.js中统 ...

  10. 翻转-Flip Columns For Maximum Number of Equal Rows

    2020-02-20 11:00:06 问题描述: 问题求解: 翻转题一个常见的思路就是站在结束的状态来反推最初的状态,本题的解题思路就是站在结束的时候的状态来进行反推. 如果在最终的状态i-row是 ...