算法导论-动态规划-钢条切割问题

文章目录

  • 一、钢条切割定义
  • 二、具体步骤
  • 1.思考
  • 2.代码思考
  • 3.动态规划求解
  • 4.伪代码
  • 三:总结:


一、钢条切割定义

算法导论-动态规划-钢条切割问题_第1张图片

图为价格表
给定一段长度是n的钢条和一个价格表,求切割方案使得收益达到最大(允许全不切割的情况存在)

二、具体步骤

1.思考

易知长度为n的钢条有2的n-1次方种选择方式,故不可穷举。
我们可以考虑一段长度为n的钢条切段,在第k处时切开,如图:算法导论-动态规划-钢条切割问题_第2张图片
这样的话,在n1段的前k-1上寻找最佳解,同理,在n2段的后m-k上寻找最佳解。这样的话问题就成为了:将两段钢条看成两个独立的钢条问题,我们称钢条切割问题满足最优子结构

还有另一种思路,采用更为简单的递归求解思想:

  1. 一段长度为i的不可分割的钢条
  2. 一段长度为n-i的混合钢条
    算法导论-动态规划-钢条切割问题_第3张图片

2.代码思考

  1. 先看看第二种算法(简单易于理解)
    算法导论-动态规划-钢条切割问题_第4张图片
    在这里采用自顶而下的递归算法,但这里的算法是失败的,问题在于它花费了大量时间来重复计算
    算法导论-动态规划-钢条切割问题_第5张图片

拿长度为4来举例,规模为1的重复计算有4个,规模为0的重复计算有8个。
其时间复杂度为2的n次方

3.动态规划求解

  1. 带备忘的自顶而下法:之前算法慢的主要原因是因为大量重复运算,所以可以在过程中保留子问题的解(通常在数组或者散列表中),需要子问题的解时会首先检查是否保存从而节省了时间。
  2. 自底而上法:这个问题一般需要恰当的定义子问题规模,使得子问题求解依赖于更小的子问题求解,将子问题的规模按从小到大来排序求解,求解一个问题时是依赖更小问题的解,所以每个问题只要求解一次。

4.伪代码

  1. 自顶而下法:算法导论-动态规划-钢条切割问题_第6张图片
  2. 自下而上法:算法导论-动态规划-钢条切割问题_第7张图片
    算法导论-动态规划-钢条切割问题_第8张图片
    算法复杂度为O(n平方)

三:总结:

时间复杂度都是n的平方,但是带备忘的自上而下法还是递归,自下而上则不是递归了。

你可能感兴趣的:(数据结构,动态规划)