首页 > 代码库 > 动态规划学习笔记--对于钢条切割方案的思考

动态规划学习笔记--对于钢条切割方案的思考

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)

 

最后,我们只需要找出上面列出的组合的最大值即可。

 

动态规划学习笔记--对于钢条切割方案的思考