一、钢条切割定义
图为价格表
给定一段长度是n的钢条和一个价格表,求切割方案使得收益达到最大(允许全不切割的情况存在)
二、具体步骤
1.思考
易知长度为n的钢条有2的n-1次方种选择方式,故不可穷举。
我们可以考虑一段长度为n的钢条切段,在第k处时切开,如图:
这样的话,在n1段的前k-1上寻找最佳解,同理,在n2段的后m-k上寻找最佳解。这样的话问题就成为了:将两段钢条看成两个独立的钢条问题,我们称钢条切割问题满足最优子结构。
还有另一种思路,采用更为简单的递归求解思想:
- 一段长度为i的不可分割的钢条
- 一段长度为n-i的混合钢条
2.代码思考
- 先看看第二种算法(简单易于理解)
在这里采用自顶而下的递归算法,但这里的算法是失败的,问题在于它花费了大量时间来重复计算
拿长度为4来举例,规模为1的重复计算有4个,规模为0的重复计算有8个。
其时间复杂度为2的n次方
3.动态规划求解
- 带备忘的自顶而下法:之前算法慢的主要原因是因为大量重复运算,所以可以在过程中保留子问题的解(通常在数组或者散列表中),需要子问题的解时会首先检查是否保存从而节省了时间。
- 自底而上法:这个问题一般需要恰当的定义子问题规模,使得子问题求解依赖于更小的子问题求解,将子问题的规模按从小到大来排序求解,求解一个问题时是依赖更小问题的解,所以每个问题只要求解一次。
4.伪代码
- 自顶而下法:
- 自下而上法:
算法复杂度为O(n平方)
三:总结:
时间复杂度都是n的平方,但是带备忘的自上而下法还是递归,自下而上则不是递归了。