算法——动态规划

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

计算每个单元格时用的是同样的公式:

 
   
   
 
  1. 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 | 问题分析 | 动态规划算法设计 | 代码示例 )

Python之动态规划算法

算法动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

算法动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

代码随想录动态规划算法PDF

算法13---动态规划钢材裁剪