首页 > 代码库 > 动态规划学习笔记--对于钢条切割方案的思考
动态规划学习笔记--对于钢条切割方案的思考
1.问题描述
对一个长为n的钢条,给出不同长度钢条对应的单价,求出如何切割能使得该钢条的收益最大化。
2.问题解析
(1)暴力法
找出所有切割方案(共2^(n-1)种),计算出每种切割方案的收益,求最大值。
时间复杂度:O(2^(n-1))
(2)动态规划
这一问题是《算法导论》中,讲解动态规划的例题。
为什么这题能够用动态规划解决呢?
动态规划是用来解决具有以下性质的问题的:
1.最优子结构
2.重复子问题
这两个性质,显然前者更为重要,而后者没有也可以用动态规划解决(我现在这么认为)。
动态规划的正确性证明
为什么这一题具有最优子结构性质呢?
对于最优解(最优切割方案),它切割下来的每一段钢条都应该是对于该长度最优的切割方案,否则,继续切割能获得更优的解。
注意:这里的最优子结构应看做一种“必要非充分条件”。
最优子结构组合起来的一定是最优解吗?显然不是!
举个最极端的例子,如果把长为n的钢条切割为n个长为1的钢条,那么每段钢条都是该长度最优的切割方案了。而我们显然不能认为最优的切割方案就是这样。
那么要如何达到“充分”呢?
由于最优子结构是必要条件,因此正确答案一定存在于所有的最优子结构组合中。如何找到它,一个简单的想法如下:
再次用暴力法,对每种最优子结构的组合进行遍历,找到最优解!
现在有了“必要”,有了“充分”,我们确保了动态规划解决这个问题的正确性。
具体动态规划方案设计中的难点
分析到这里,我们想要解决这个问题,还有一个难点,那么就是如何找出所有最优子结构的组合!这个难点也就是动态规划中,状态如何表示,以及状态如何转移的难点。
突破点:用子问题定义最优解。
最优解与它的子问题的关系可以分类为如下几种:
1.仅与比它的规模小1的子问题相关。//提示:这与重复子结构不是矛盾的,在做某些题的时候我们可以看到,如最长公共子串。
2.与满足特定条件的多个子问题相关。
3.与所有子问题相关。
到了这里我们已经感受到动态规划的灵活度之高了,很难找到一种套路。
对3种关系进行思考,我们初步假定这个问题适用第3种关系,这里仅提供一个不完善的思路。
每个最优子结构组合可能有多个自问题,我们希望尽量减少最优子结构组合的数量,因此我们思考是否一个最优子结构组合可以只包含一个子问题。
本题中,假设规模为n的最优解为d(n),按照上面的想法,我们发现可以列出它的所有最优子结构组合:
d(1)+p(n-1)
d(2)+p(n-2)
……
d(n)+p(0)
最后,我们只需要找出上面列出的组合的最大值即可。
动态规划学习笔记--对于钢条切割方案的思考