算法——动态规划
Posted 代码综合征
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法——动态规划相关的知识,希望对你有一定的参考价值。
本节学习动态规划:它将问题分成小问题,并先着手解决这些小问题。
背包问题
本节同样考虑背包问题:
三件商品,音响3000元,4磅;笔记本电脑2000元,3磅;吉他1500元,1磅。
一个背包可以装4磅的东西,如何往背包中装商品能够得到最高的价值?
有一个简单的算法,尝试各种可能的组合,并找出价值最高的组合。但是这样的算法非常慢,因为其运行时间为O(n^2)。
动态规划
动态规划实际是先解决子问题,在逐步解决大问题。比如针对背包问题,动态规划可以从一个网格开始:
1磅 | 2磅 | 3磅 | 4磅 | |
---|---|---|---|---|
吉他 | 1500 | 1500 | 1500 | 1500 |
音响 | 1500 | 1500 | 1500 | 3000 |
笔记本电脑 | 1500 | 1500 | 2000 | 3500 |
计算每个单元格时用的是同样的公式:
cell[i][j]=max(上一个单元格的值(cell[i-1][j]), 当前商品的价值+剩余空间的价值(cell[i-1][j-当前商品的重量]))
对于这个表格填充来说:
行的排列顺序发生变化,结果不变。按逐列填充而不是逐行填充,可能会有影响。
需要考虑细分的粒度,比如再背包问题中增加了0.5磅的项链,那么就需要细分粒度。
旅游行程最优化
假设想去伦敦旅游,假期两天,每个景点游览的时间不同,评分不同。想设计出一个旅程,所有游览的景点总评分最高。这个问题也可以看做是一个动态规划的问题。
名胜 | 时间 | 评分 |
---|---|---|
威斯敏斯特教堂 | 0.5天 | 7 |
环球剧场 | 0.5天 | 6 |
英国国家美术馆 | 1天 | 9 |
大英博物馆 | 2天 | 9 |
圣保罗大教堂 | 0.5天 | 8 |
动态规划的表格为:
0.5 | 1 | 1.5 | 2 | |
---|---|---|---|---|
威斯敏斯特教堂 | 7 | 7 | 7 | 7 |
环球剧场 | 7 | 13 | 13 | 13 |
英国国家美术馆 | 7 | 13 | 16 | 22 |
大英博物馆 | 7 | 13 | 16 | 22 |
圣保罗大教堂 | 8 | 15 | 21 | 24 |
这样就得到了最优解。
另外,考虑如果还想去巴黎,埃菲尔铁塔、卢浮宫、巴黎圣母院每个需要1.5天。但是实际上这里面有0.5天的时间是从英国移动到法国。
旅程中只要增加了任意一个法国的景点,法国其他景点的时间会减少0.5。这种情况如何使用动态规划呢?
这种情况没办法使用动态规划。因为动态规划的每个子问题必须是离散的,互相不会有依赖。
总结
需要在给定约束条件下优化某种指标时,动态规划很有用。
问题可分解为离散子问题时,可使用动态规划来解决。
每种动态规划解决方案都涉及网格。
单元格中的值通常就是你要优化的值。
每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题。
没有放之四海皆准的计算动态规划解决方案的公式。
以上是关于算法——动态规划的主要内容,如果未能解决你的问题,请参考以下文章
算法动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )
算法动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )