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


一、钢条切割定义

在这里插入图片描述

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

二、具体步骤

1.思考

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

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

  1. 一段长度为i的不可分割的钢条
  2. 一段长度为n-i的混合钢条
    在这里插入图片描述

2.代码思考

  1. 先看看第二种算法(简单易于理解)
    在这里插入图片描述
    在这里采用自顶而下的递归算法,但这里的算法是失败的,问题在于它花费了大量时间来重复计算
    在这里插入图片描述

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

3.动态规划求解

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

4.伪代码

  1. 自顶而下法:在这里插入图片描述
  2. 自下而上法:在这里插入图片描述
    在这里插入图片描述
    算法复杂度为O(n平方)

三:总结:

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

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值