动态规划解题思路


以01背包问题为例

一、状态表示dp[ i ][ j ]

  1. 根据枚举思想抽象出一种集合

    步骤:

    1. 明确问题目的
      01背包问题的目的是从一堆有权重和体积的物品中存放到一定体积的背包中,要求找到能让放在背包中的物品总价值和最大那种取法。

    2. 根据枚举思想抽象出集合
      问题的目的是找到最佳取法,那么根据枚举思想,我们需要枚举出所有的取法,那么抽象出来的集合就是:从前 i(0 ~ n) 个物品中考虑并且选出的物品总体积不能超过 j(0 ~ m),每种不同的 i、j 取值对应着不同的集合。

      e.g.

      • 从前0个物品中考虑,并且取出的物品总体积不能超过0

      • 从前0个物品中考虑,并且取出的物品总体积不能超过1

      • 从前3个物品中考虑,并且取出的物品总体积不能超过0

      • 从前3个物品中考虑,并且取出的物品总体积不能超过1

      以上的不同的 i、j 取值就是不同的集合,其中每种集合内的元素就是所有不同的取法。

    3. 每个集合都具有属性
      根据动态规划的几种题型,集合的属性为:元素最大值、元素最小值、元素个数。

    4. 抽象集合的作用
      (1) 帮助确定几维状态
      (2) 帮助确定每种状态的含义
      (3) 后面对于集合的划分可以求得状态转移方程

  2. 根据抽象出来的集合来确定用几维的状态

    01背包问题中每种集合的 i(考虑前几个物品数) 和 j(取出的总体积) 为变量,所以这里可以定义为二维状态 dp[ i ][ j ]。

  3. 根据抽象集合来明确每一种状态的含义是什么

    集合的含义是从前 i(0 ~ n) 个物品中考虑并且选出的物品总体积不能超过 j(0 ~ m) 所有取法的集合,根据01背包问题的目的,我们就是要找到集合的最大值,那么就能想出,dp[ i ][ j ] 表示的是每一种集合中,某种选法能让选取物品的总价值最大的那一种选法 (状态),dp[ i ][ j ] 的含义就是从前 i 个 物品中考虑并且选出的物品总体积不能超过 j 的最大价值。

二、状态计算 —— 集合划分

  1. 子集划分的原则:

    • 不重 (求最值的时候可以重复,计算数量的时候不行)
    • 不漏
  2. 子集划分依据:

    以最后开始的第一个不同条件作为划分依据,例如:01背包问题中从最后开始的第一个不同条件就是选第 i 个物品 或 不选第 i 个物品

    01背包问题中将集合划分为下面两大类:

    • 选取物品的时候不去选第 i 件物品:dp[i][j]=dp[i−1][j]dp[i][j]=dp[i - 1][j]dp[i][j]=dp[i−1][j]
    • 选取物品的时候一定选到第 i 件物品:dp[i][j]=dp[i−1][j−v[i]]+w[i]dp[i][j]=dp[i-1][j - v[i]] + w[i]dp[i][j]=dp[i−1][j−v[i]]+w[i]
  3. 状态转移方程:
    dp[i][j]=max(dp[i−1][j],dp[i−1][j−v[i]]+w[i])dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]] + w[i])dp[i][j]=max(dp[i−1][j],dp[i−1][j−v[i]]+w[i])

    通过状态转移方程求出所有的状态后:

    01背包问题的目的是从 n 件物品中选取,并且总体积不超过 m 的最大价值,那么根据 dp[ i ][ j ] 的含义就可以得出答案为 dp[ n ][ m ]

三、DP优化

对动态规划的代码或者状态转移方程进行等价的变形

模版 ----- DP相关推荐

  1. MasterPage技术

    看页面觉得很奇怪,怎么在源代码里看不到链接,效果上却有链接,于是猜想是不是有类似jsp里面的include之类的方法,比如说当初我用的用户自定义控件usercontrol之类的,结果没发现,却发现多了 ...

  2. MasterPage控件的用法

    今天学习了一下Master..感觉还真挺不错的!~~ 现在把它的主要功能和大家介绍一下,也许对一些和我一样的初学者还是有点帮助的~~ MasterPage其实是一种模板,它可以让你快速的建立相同页面布 ...

  3. 树形dp技巧,多叉树转二叉树

    今天复习树形dp时发现一道比较古老的题,叫选课,是树形dp的一道基础题,也是多叉树转二叉树应用的模版题 多叉树转二叉树的应用非常广泛,因为如果一个节点的儿子太多,一个一个存下来不方便去查询,并且会增加 ...

  4. 状态压缩DP AcWing算法提高课 (详解)

    基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...

  5. bzoj1833: [ZJOI2010]count 数字计数USACO37 Cow Queueing 数数的梦(数位DP)

    难受啊,怎么又遇到我不会的题了(捂脸) 如题,这是一道数位DP,随便找了个博客居然就是我们大YZ的--果然nb,然后就是改改模版++注释就好的了,直接看注释吧,就是用1~B - 1~A-1而已,枚举全 ...

  6. 【转】别人整理的DP大全

    为什么80%的码农都做不了架构师?>>>    动态规划 动态规划 容易: 1018 , 1050 , 1083 , 1088 , 1125 , 1143 , 1157 , 1163 ...

  7. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  8. 动态规划 —— 数位 DP

    [概述] 数位 DP 实际是一种计数用的 DP,一般就是统计一个区间 [le,ri] 内满足一些条件数的个数. 所求的限定条件往往与数的位数有关,例如:数位之和.指定数码个数.数的大小顺序分组等. 题 ...

  9. poj--1625Censored!+AC自动机上的dp+大数

    题目链接:点击进入 其实看起来是完全可以用矩阵做的,但是因为用到了大数的,导致内存开不下,所以用dp写了.其实dp的过程依旧就是在我们用禁止出现单词构建的trie上走m步的过程.我们定义dp[i][j ...

最新文章

  1. 前facebook产品技术leader徐玮:如何建立用户增长机制
  2. C++描述杭电OJ 2023.求平均成绩 ||
  3. map分组后取前10个_hive中分组取前N个值的实现
  4. android返回上一级代码,Android实践11 | 利用intent返回数据给上一级activity
  5. 笨办法学R编程(4)
  6. Windows 下载安装 SonarQube和使用
  7. 【面试题】Java三大特性封装继承多态总结
  8. 使用批处理脚本修改hosts文件
  9. 双线性插值实现图像放大算法 matlab,FPGA/verilog实现双线性插值图像放大
  10. 官宣!1024 程序员节日程发布,第一代程序员求伯君将出席大会
  11. ESP32超详细学习记录:NTP同步时间
  12. linux用root权限执行命令,Linux root权限获取之sudo命令详解
  13. 项目建议书-在线书籍购物书
  14. 中国区块链标准建设分析
  15. Abaqus 2016 安装总结
  16. 【在线听】香港回归20周年历年金曲奖歌曲
  17. 为什么支付宝我扫别人的二维码就是付款,别人扫我的就是转账?
  18. matlab怎么求两个数的和,matlab怎么求出两个函数的交点
  19. Pycharm项目使用pyinstalle打包过程中问题及解决方案
  20. BMW BENZ AUDI 宝马,奔驰,奥迪维修标准工时,从KSD,WIS, ELSA 中提取。

热门文章

  1. jsp内置对象*session
  2. 归并法计算数组中的逆序数对
  3. 《设计模式详解》结构型模式 - 组合模式
  4. 【MyBatis笔记】09-一对多关系建表
  5. SELinux系列(十七)—awk命令使用详解
  6. oracle修改用户的登录密码
  7. java代码 创建文件夹的方法
  8. Linux操作Oracle(17)——linux oracle启动时 :各种报错 解决方案(2020.07.30更新...)
  9. 东航期货模拟交易brockerid(期货公司的客户号)
  10. 多重共线性问题的几种解决方法