对于动态规划的第一次系统认知

第五周ACM培训内容梳理

事实上听了一周多的培训课讲解,我对于动态规划的认识也只有一开始所具有的对于状态和阶段以及状态转移方程的认识,并且这种认识基本上也仅仅停留在知道层面。对于其内外含义的认识甚至都是错误的。在看讲课题和训练题的过程中,我对于动态规划的认知只能在无形中不断加深。依次下去,我的算法道路最终只能半途而废。然而,天无绝人之路,在多次翻学《算法设计基础》这本书之后,在有了“最优决策表”作为桥梁之后,我对于动态规划内基本概念的认识才得以健全,我对于状态转移方程的构建也就是状态关系的寻找也才有了最基本的感觉。

  1. 状态与阶段
    在对于书上第一个问题的分析的阅读中我第一次了解到了一个新的概念——最优决策表。这是一种能更为直观表现各状态和各阶段最优答案关系的一种工具。一开始我总是把它当做搭建问题与状态转移方程的桥梁,后来才发现,它所能起的作用远比这要高的多。
    其中最大的作用之一就是帮我重新认识了一个对于各状态及阶段的认知和提升对于如何划分阶段状态的认知。
    首先是状态,这在最右决策表中通常放在列中。状态指的是整个问题的各个小问题,这种认识是从第一次动态规划课上就形成的看法。然而当一个个问题摆在我的眼前时,一切显得是如此高不可攀。然而,经过书本上对于第一个背包问题的详细分析,我发现这种认识是绝对错误的。事实上当我们要处理容量为n的背包要如何装货时,在动态规划地安排下,我们需要对容量为1到n的所有问题做统一的处理。而此时,这所有n个问题才是该问题的状态。而对于阶段,不过是处理每个状态时逐步加入限制条件(比如每次在处理的货物数量上加一)所后所需要求出的最优答案。
  2. 寻找关系构建状态转移方程
    在上次课前预习时,我总是苦恼于看不懂课件上的状态转移方程,并在临上课前也对老师简单问了问,但都没能得到自己想要的答案。在这里,我发现了一个问题,自己经过不懈努力所得出的对于一个问题的回答远比其他人的讲解要实在并记忆深刻的多。
    在汪老师的《算法设计基础》这本书中自然也对状态转移方程做不了非常明确的解释。不过,综合之前所讲的题目以及对于主要是凑硬币这道题的解析中,我对于状态转移方程的理解终于取得了突破性进展。其中最重要的就是对于i与j的突破性认识,以及为什么要给第二个j减去一个值的理解。i在这里指的是状态,j在这里指的是阶段,这一点在课上老师已经明确说明了,只是当时对于状态与阶段的理解存在偏差才导致现在的重新理解。而对于每一次第二个j减去的值则正是每个阶段所拥有的一个特征常量(比如钱币面值的大小),并利用之前的数据进行一个选取最优解的一个巧妙处理。
  3. 状态转移方程的优化处理
    如果说对于以上问题的理解只能说是查缺补漏,那对于接下来这个问题的理解则可以说的上是意外收获。在处理凑硬币这道题的状态转移方程时,不同阶段与状态下的关系复杂多样有的是一个求最值,有的是两个求最值,还有的是三个求最值,而且具体哪一个还怎么处理也是比较杂乱。这样下来,程序带吗中是不可能用单一的状态转移方程来解决所有问题的。毕竟这样太过复杂。
    汪老师提供了一个新的思路,将各阶段重新划分一个循环进行寻找最值,虽然说这样也许时间复杂度上会提升不少,但也算是能把代码尽可能的简化到了一个相当简单的程度。
    最后,我想说给自己一句话:对于拥有真正的理解与收获来说,合适的提点与广泛的阅读题目解析是同等重要的。这也是量变与质变原理在这里的体现之一吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flww*星火燎原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值