zoukankan      html  css  js  c++  java
  • 《图解算法》读书笔记(九) 动态规划

    其实这本书我已经在读第二次了,之前的章节都没有特别深的感悟,有些东西只是温故;
    而在动态规划这章节,再次地阅读却让我知新,对动态规划算法有了更深一步的理解。
    好的算法就是这样经久不衰,就像好的影视剧作品,能够吸引我们再三观看,揣摩。

    章节内容

    • 学习动态规划
    • 设计问题的动态规划解决方案

    背包问题

    在之前一章的背包问题中,我们找到的近似解却不是最优解。如何找到最优解?
    我们这边不妨把音响$3000、笔记本电脑$2000、吉他$1500的重量分别修改为4、3、1磅。背包可装4磅的东西。

    简单算法

    我们需要尝试各种商品的组合,并找到价值最高的组合。这是一个幂级的复杂度

    动态规划

    对于背包问题,我们先解决小背包问题,再逐步解决原来的问题。
    假设有如下表格

    1磅 2磅 3磅 4磅
    吉他
    音响
    电脑
    假设只有吉他可以装,因为吉他重量为1磅,所以无论背包可以装多重,最高价值都是1500。
    1磅 2磅 3磅 4磅
    ---- --- --- --- ---
    吉他 1500 1500 1500 1500
    音响
    电脑
    现在来填充第二行,假设这时候多了音响可以装。
    因为音响重量为4磅大于1,2,3,所以前面三个不变,背包为4磅的时候可以装下音响,因为音像的价格大于之前的1500,所以选择装音响。
    1磅 2磅 3磅 4磅
    ---- --- --- --- ---
    吉他 1500 1500 1500 1500
    音响 1500 1500 1500 3000
    电脑
    这时候多了笔记本电脑可以装,我们来填充第三行。
    因为笔记本电脑为3磅,前面两个不变。磅数等于3的时候因为电脑价格2000大于之前的1500,所以选择2000。
    最后背包为4磅的时候,我们根据背包为3磅的时候最高价值为2000,这时候还剩下1磅可以装吉他,总价值为3500.大于之前的3000。
    1磅 2磅 3磅 4磅
    ---- --- --- --- ---
    吉他 1500 1500 1500 1500
    音响 1500 1500 1500 3000
    电脑 1500 1500 2000 3500
    我们得到一个公式:
    第i行第j列等于一下两者的最大值:
    1. 上一个单元格第i-1行第j列的价值
    2. 当前商品的价值+剩余空间价值

    最长公共子串

    cell[i][j] = word1[i] == word2[j] ? cell[i-1][j-1] + 1 : 0

    最长公共子序列

    cell[i][j] = word1[i] != word2[j] ? max(cell[i][j-1],cell[i-1][j]) : cell[i-1][j-1] + 1

    小结

    1. 需要在给定约束条件下优化某种指标,动态规划很有用
    2. 问题可分解为离散子问题,可使用动态规划
    3. 每种动态规划解决方案都涉及网络
    4. 单个园中的值通常就是你要优化的值
    5. 每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题
    6. 没有放之四海皆准的计算动态规划解决方案的公式
  • 相关阅读:
    Cgroup学习笔记
    基于dubbo框架下的RPC通讯协议性能测试
    More about dubbo
    基于nginx tomcat redis分布式web应用的session共享配置
    基于开源Dubbo分布式RPC服务框架的部署整合
    More about Tair (NoSql)
    MySql Replication配置
    Memcached、Redis OR Tair
    基于淘宝开源Tair分布式KV存储引擎的整合部署
    关于TbSchedule任务调度管理框架的整合部署
  • 原文地址:https://www.cnblogs.com/prelude1214/p/13629773.html
Copyright © 2011-2022 走看看