简单粗暴地理解动态规划

动态规划可以说是做题时比较难以理解的算法了,我之前也不是很理解,直到在随机过程中学习了马尔科夫过程后,再看动态规划就觉得很简单了。
本文只是帮助简单粗暴的理解动态规划,熟练地运用需要亲自进行大量的习题练习。

一、动态规划适合解决什么样的问题?
1、问题具有最优子结构
举一个直白易懂的例子:求你走路的时候迈三步能走出的最大距离。如果你想三步走过距离最大,那你每一步都应该很大,在这三步走的过程中,迈出两步的距离也应该是最大的距离。这样,三步最大的就有一个子结构——两步最大。

2、无后效性
仍用上面的例子:你走完第二步的时候,最大距离是2.5米,这个2.5米就包含了你前两步的信息了,就不用再管你第一步是怎么走的了。
粗暴的说就是:当前面的结果知道了,我根本不关心得出这个结果的过程是啥。

如果这两点还不够简单粗暴,那就记住求最值问题一般都能用动态规划。

二、动态规划的解题思路
动态规划所处理的问题是一个多阶段决策问题,不断的求局部最优解,最终得到全局最优。
可以分为四步:

1、问题分解成子问题:按照问题的时间或空间特征,把全局问题分为若干个局部问题。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

2、确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

3、状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。
所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

4、寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

三、动态规划的关键步骤
动态规划的主要难点在于理论上的设计,也就是上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。

使用动态规划求解问题,最重要的就是确定动态规划三要素:

(1)问题的阶段
(2)每个阶段的状态
(3)从前一个阶段转化到后一个阶段之间的递推关系。

递推关系是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。

确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}

参考:
https://blog.csdn.net/zw6161080123/article/details/80639932

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值