动态规划总结

原创 2016年05月31日 22:31:50

一、知识点整理

(一)、动态规划是解决多阶段策略问题的一种方法,运用最优性原理,排除重复计算,用空间换时间的算法。

(二)、动态规划适用的题目类型有以下几个特点:

       1.问题具有多阶段的决策

        2.每个阶段对应一个状态(状态变量)

        3.每个阶段有一个决策(不同的决策导致下一个阶段不同的状态)

        4.每个阶段的最优解可以递归地归结为下一个阶段各个可能状态的最优解问题

(三)、一般的解题步骤

        1.判断问题是否具最优子结构性质者

        2.分阶段

        3.建立状态转移方程(递归公式)

        4.找出边界条件

        5.将已知的边界值带入方程

        6.递归求解

(四)、背包问题

 1、01背包

特点:每种物品仅有一件,可以选择放或不放,求最大价值

状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]};

伪代码:(空间优化)

for i=1..N

for v=v..0

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

(若要求恰好装满背包,初始化的时候除了将f0]=0,其余的均为负无穷;

若没有要求必须装满,初始化的时候将f[0...v]都设成0)

2、完全背包

特点:每种物品有N件,可以用无限次,求费用总和不超过容量的最大价值

状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i](0<=k<=v/c[j]);

伪代码:(空间优化)

for i..N

for v=0..V

f[v]=max{f[v],f[v-cost[i]]+w[i]}

(简单优化:将费用大于容量的去掉,两个物品相比,若一个的费用高并且重量小则直接去掉)

3、多重背包

特点: N种物品和容量为V的背包,第i种物品最多有n[i]件可用,求费用总和不超过容量的最大价值

优化:

二进制思想:多重背包中的一个物品变成0-1背包中的多个物品

4、分组背包

特点:N件物品容量为V,这些物品被分若干组,每组中的物品发生冲突时最多选一件。转化为每组物品有若干种策略

状态转移方程:f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i](物品i属于k组)

伪代码:

for k=1..K(所有k组)

for v=V..0

for 所有的i属于k组

f[v]=max{f[v],f[v-c[i]+w[i]]}

5、区间DP

区间动态一般都是将一个区间问题不断划分为更小的区间甚至一个元素组成的区间,枚举他们的组合,求合并后的最优值。

区间动态规划的模板代码:

for(int p=1;p<=n;p++){

for (inti=1;i<=n;i++){

int j=i+p-1;

for (int k=i;k<j;k++)

dp[i][j]=min{dp[i][k]+dp[k+1][j]+w[i][j]};

dp[i][j]=max{dp[i][k]+dp[k+1][j]+w[i][j];

}}
二、感悟

      老师刚开始上课就说,这部分题简单的很简单,难得很难,确实体会到了。刚开始做的那几个题,太简单了,代码分分钟写出来AC,但是做到后边。。。

      有些题目动态规划和贪心算法都能解决,但是不同的是,动态规划的下一步状态与前一步密切相关。最难的地方就是状态转移方程,刚开始做直接晕了,非常不理解,后来做的多了,慢慢的就有点懂了,但是主要还是靠套公式,感觉还是没有真正理解。

      这个专题老师延长了很长时间,但还是没有做完题目,而且最后几篇博客都是刚补的,还是应该做一个题写一篇博客,否则时间长了思路都忘了。下个专题得改掉这个不好的习惯。





动态规划总结与思考

这是一篇关于动态规划的思考文章,主要讲了我对动态规划的一些思考与总结。...
  • qiuzhijieluojianping
  • qiuzhijieluojianping
  • 2015年01月01日 10:57
  • 773

动态规划总结——经典问题总结

动态规划总结——经典问题总结 本文着重讨论状态是如何表示,以及方程是怎样表示的。当然,还附上关键的,有可能作为模板的代码段。但有的代码的实现是优化版的。 经典问题总结 最长上升子序列(LIS) 问题描...
  • qfikh
  • qfikh
  • 2016年07月19日 13:08
  • 2751

动态规划思想总结

一、dp的思想及实现方法:   动态规划是求解决策过程最优的数学方法,它的核心思想是把多阶段过程转化为一系列单阶段的问题,利用各阶段之间的关系,逐个求解。 二、动态规划大的分类: (1)线性动规...
  • small__snail__5
  • small__snail__5
  • 2016年07月30日 17:00
  • 384

LeetCode总结,动态规划问题小结

一,参考一般书籍中的“动态规划”讲解 1、基本概念 动态规划(Dynamic Programming)对于子问题重叠的情况特别有效,因为它将子问题的解保存在表格中,当需要某个子问题的解时,直接取值即...
  • EbowTang
  • EbowTang
  • 2016年03月04日 23:50
  • 5606

动态规划总结【模板】

最长递增子序列 最大连续子序列和 最大连续子矩阵和 最大M个连续子段的和 最大不连续子序列和 最长公共子序列 最长回文子序列 最长回文子串 最小编辑距离 01背包 完全背包 多重背包 二维费用背包 切...
  • u011676797
  • u011676797
  • 2015年05月01日 23:49
  • 1930

LintCode动态规划题总结

不知道什么是动态规划的,传送门在这儿:[干货]动态规划十问十答 动态规划进阶:动态规划:从新手到专家 相信看完上面两个链接的博客后,应该对于动态规划有一个新的认识和了解了。接下来就来看看LintCod...
  • luoshengkim
  • luoshengkim
  • 2016年08月13日 23:45
  • 1136

动态规划小结——背包问题

背包问题是动态规划的经典问题,因此,有必要弄清跟背包问题的所有分析过程并熟练掌握各种类型的代码 一,完全背包问题 1.问题描述:有n种物品,每种物品有无限多个,第i个物品重量是wi,价值是vi,从这些...
  • u014800748
  • u014800748
  • 2015年02月12日 12:24
  • 668

动态规划题目总结

题目1: 输出描述: 对于每组数据,输出一个整数,代表最长递增子序列的长度(不需要连续)。 输入例子: 2 7 89 256 78 1 46 78 8 5 6 4 8 2 17 ...
  • basycia
  • basycia
  • 2016年08月04日 11:03
  • 514

LeetCode总结 -- 一维动态规划篇

这篇文章的主题是动态规划, 主要介绍LeetCode中一维动态规划的题目, 列表如下: Climbing StairsDecode WaysUnique Binary Search TreesMaxi...
  • linhuanmars
  • linhuanmars
  • 2014年08月10日 11:16
  • 22057

动态规划——算法总结(三)

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子...
  • lu930124
  • lu930124
  • 2015年06月19日 15:14
  • 993
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划总结
举报原因:
原因补充:

(最多只允许输入30个字)