【DP】经典问题解析
2012-10-20 20:19
190 查看
解决DP(动态规划)问题是需要思维训练的,下面列举了四个经典的DP问题和解析,希望对大家有帮助。
【题目比较长,在此略去了,可以从网上搜到具体描述。】
(一)最长单调递增子序列问题(递减同理)
(1)用一个数组b
记录以a[i]结尾的最长单调递增子序列的长度
(2)b[i] = max{a[k] | a[k] < b[k],0 ≤ k < i} + 1, b[0] = 1
(3)序列a的最长单调子序列的长度为max{b[i], 0 ≤ i < n}
(二)最大子序列和问题
(1)用一个数组b
记录以a[i]结尾的最大子序列和
(2)b[i] = max{a[j] + b[i-1], a[j]}
(3)序列a的最大子序列和为max{b[i], 0 ≤ i < n}
(三)最大子矩阵和问题(上题的二维扩展)
(1)限定列的范围(i~j)
(2)对列范围内的每一行求和,从而化为一维序列
(3)化归为问题(二)
(四)背包问题
(1)用一个二维数组m,m[i][j]代表在承重j,装入物品为从i到n时可以达到的最大价值
(2)m[i][j] = max(m[i+1][j], m[i+1][j-wi]+vi)
(3)m[1][j]即为最大价值
(五)滑雪问题
(1)用一个结构体数组LocHeight记录每个点的坐标和高度
用一个二维数组len记录以每个点作为路径起点的最长路径长度
(2)将结构体数组按照高度从低到高排序
注:排序的好处是,处理某个点的时候已经处理完比该点低的所有点的信息,只需一次扫描
(3)对于某点A,四周比A点低的所有点中,选len值最大的点B,将A对应的len值设为B.len+1
(4)扫描len数组,找出最大值
【题目比较长,在此略去了,可以从网上搜到具体描述。】
(一)最长单调递增子序列问题(递减同理)
(1)用一个数组b
记录以a[i]结尾的最长单调递增子序列的长度
(2)b[i] = max{a[k] | a[k] < b[k],0 ≤ k < i} + 1, b[0] = 1
(3)序列a的最长单调子序列的长度为max{b[i], 0 ≤ i < n}
(二)最大子序列和问题
(1)用一个数组b
记录以a[i]结尾的最大子序列和
(2)b[i] = max{a[j] + b[i-1], a[j]}
(3)序列a的最大子序列和为max{b[i], 0 ≤ i < n}
(三)最大子矩阵和问题(上题的二维扩展)
(1)限定列的范围(i~j)
(2)对列范围内的每一行求和,从而化为一维序列
(3)化归为问题(二)
(四)背包问题
(1)用一个二维数组m,m[i][j]代表在承重j,装入物品为从i到n时可以达到的最大价值
(2)m[i][j] = max(m[i+1][j], m[i+1][j-wi]+vi)
(3)m[1][j]即为最大价值
(五)滑雪问题
(1)用一个结构体数组LocHeight记录每个点的坐标和高度
用一个二维数组len记录以每个点作为路径起点的最长路径长度
(2)将结构体数组按照高度从低到高排序
注:排序的好处是,处理某个点的时候已经处理完比该点低的所有点的信息,只需一次扫描
(3)对于某点A,四周比A点低的所有点中,选len值最大的点B,将A对应的len值设为B.len+1
(4)扫描len数组,找出最大值
相关文章推荐
- dp 数塔 经典动态规划问题
- 深入解析:分布式系统的事务处理经典问题及模型(转载分享)
- HDU 2069 & UVA 674 Coin Change(换硬币 dp 入门经典水题,背包问题)
- POJ 3783 Balls --扔鸡蛋问题 经典DP
- 动态规划-3005-经典dp问题
- 括号匹配问题与经典笔试面试题目解析
- 经典dp(动态规划)问题常用解决策略
- 第36课 - 经典问题解析三
- 【dp经典问题】72. Edit Distance
- 专题二经典问题解析_13
- DP经典应用(五)硬币问题
- 数据结构与算法经典问题解析 Java语言描述pdf
- POJ1157 花店问题经典DP
- 经典问题解析(1)---const和引用、指针与引用、函数重载、C方式编译
- 深入解析:分布式系统的事务处理经典问题及模型(转载分享)
- 深入解析:分布式系统的事务处理经典问题及模型(转载分享)
- 深入解析:分布式系统的事务处理经典问题及模型
- leetcode 213. House Robber II 入室抢劫 抢劫问题 + 一道经典的DP动态规划问题
- c++学习笔记(17.专题四经典问题解析)
- 深入解析:分布式系统的事务处理经典问题及模型