钢条切割问题

给定一段长度为n的钢条和一个价格表pi(i=1,2,…,n),求切割钢条方案,是的销售收益rn最大。

方法一:

长度为n的钢条共有2n-1种不同的切割方案,因为在距离钢条左端i(i=1, 2, …, n-1)处,我们总是可以选择切割或者不切割。
一般的,钢条切割收益可以如下表示:
rn = max(pn, r1 + rn-1, r2 + rn-2, …, rn-1 + r1)
第一个参数pn对应不切割,直接售出长度为n的钢条。其余n-1个参数对应另外n-1种方案:对每个i = 1,2,…,n-1,首先将钢条切割成长度为i和n-i的两端,接着求解这两段的最优切割收益ri和rn-i(每周弄方案的最有收益为这两段的最有收益之和)。由于无法预知哪种方案会获得最优收益,我们必须考察所有可能的i,选取其中收益最大者。
为了求解规模为n的原问题,我们先求解形式完全一样,但规模更小的子问题。即当完成首次切割之后,我们将两端钢条看成两个独立的钢条切割问题。通过组合两个相同=关子问题的最优解,并在所有可能的两端切割方案中选取组合收益最大者,构成原问题的最优解

方法二:

固定一端,只对另一端进行递归
将钢条从左边切割下长度为i的一段,只对右边剩下的长度为n-i的一段继续进行切割(递归求解),对左边的一段则不再进行切割。即问题分解的方式为:将长度为n 的钢条分解为左边开始一段以及剩余部分继续分解的结果,所以可能简化为
rn = max(pi + rn-1) (1 <= i <= n)
自顶向下递归实现

int CutRod(int *p, int n) {if (n == 0)return 0;int q = -INF;for (int i = 1; i <= n; i++) {q = max(q, p[i] + CutRod(p, n - i));}return q;
}

但此方法会反复调用相同参数值对自身进行递归调用,即它反复求解相同的子问题
时间复杂度为:T(n) = O(2n)

方法三:带备忘的自顶向下法

仍按照递归的形式编写过程,但过程会保存每个子问题的解,当需要一个子问题的解时,首先检查是否已经保存过此解,如果是,则直接返回保存的值,否则,按照通常的方式计算这个子问题

int MemoizedCutRod(int *p, int n) {int r[maxn];for (int i = 0; i <= n; i++)r[i] = -INF;return MemoizedCutRodAux(p, n, r);
}int MemoizedCutRodAux(int *p, int n, int *r) {if (r[n] >= 0)       //如果已经计算过,则直接返回return r[n];int q;if (n == 0)return 0;else {//若没有计算过,则按照通常的方式进行计算q = -INF;for (int i = 1; i <= n; i++)q = max(q, p[i] + MemoizedCutRodAux(p, n - i, r));}r[n] = q;            //将计算结果保存在数组中return q;
}
方法四:自底向上法

恰当的定义子问题的规模,使得任何子问题的求解斗志依赖于更小的子问题的求解。因而我们可以将子问题按规模排序,按由小到大的顺序进行求解。
当求解某个子问题时,它所依赖的那些更小的子问题都已经求解完毕,结果已经保存。每个子问题只求解一次,当我们求解它(也是第一次遇到它)时,它的所有前提子问题都已经求解完毕

int BottomUpCutRod(int *p, int n) {int r[maxn];r[0] = 0;int q;for (int j = 1; j <= n; j++) {q = -INF;for (int i = 1; i < j; i++)q = max(q, p[i] + r[j - i]);r[j] = q;}return r[n];
}

5-8行按照升序一次求解每个规模为j的子问题。求解规模为j的子问题方法与CutRod所采用的方法相同,只是直接访问数组r[j-i]来获得规模为j-i的子问题的解,而不必进行递归调用
将规模为j的子问题的解存入r[j]
最后返回r[n],即最优解rn

自底向上与自顶向下算法时间复杂度均为O(n2)

钢条切割问题 DP相关推荐

  1. 钢条切割(dp解法)

    1. 问题描述: Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi( ...

  2. 钢条切割(记忆型递归)dp

    题目: Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2 ...

  3. 动态规划,java实现算法导论15章钢条切割

    来自浙江理工大学在读研究生Yuner: github地址 个人博客地址 此问题dp式 :rn = max(pi + r(n-1)) 不使用dp,用普通的递归方式来求解 //使用普通的方法来计算钢条切割 ...

  4. 动态规划经典例题:钢条切割

    一.递归算法 如果在第i个地方切割,就把钢条分为两个长度为i,n-i的钢条,问题转化为求这切割两个钢条的最大价值之和 考虑到不切割时的价值 只要比较不切割时的价值和所有切割情况价值和的最大值即可 递归 ...

  5. 数据结构(python) —— 【34: 动态规划之钢条切割问题】

    钢条切割问题 1. 问题 某公司出售钢条,出售价格与钢条长度之间的关系如下表: 问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大. 2. 思路 思考: 长度为n的钢条的不同切 ...

  6. 贪心、动态规划:钢条切割

    题目描述 Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1, ...

  7. C/C++之钢条切割

    钢条切割 Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案.假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2 ...

  8. 算法导论---钢条切割

    题目: Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. ​ 假定我们知道Serling公司出售一段长度为i英寸的钢条的价格为p;(i= ...

  9. 算法导论中的钢条切割问题

    问题描述:   公司购买长钢条,将其切割为短钢条进行出售,切割工序本身没有成本支出,公式管理层希望知道最佳的切割方案.假定我们知道公司出售一段长为i英寸的钢条价格为pi:钢条的长度均为整英寸.给定一段 ...

最新文章

  1. vCenter 5.5升级到vCenter 6.0实战指导
  2. android程序贴吧,【Android 教程总结贴】归纳所有android贴
  3. Android之GSON解析JSON
  4. 软件开发定律系列之布鲁克斯定律有感
  5. 如何使用Fescar保证Dubbo微服务间的一致性
  6. jquery Ajax请求本地json
  7. java.util.ListIterator
  8. gns3中两个路由器分别连接主机然后分析ip数据转发报文arp协议_ARP协议在同网段及跨网段下的工作原理...
  9. java awt 按钮响应_Java AWT按钮
  10. Makefile之变量(10)
  11. 一千五百个优雅的中国女孩的名字
  12. 5岁自学python编程-25 岁才开始学习python晚吗?40 岁都不晚!
  13. python写错了如何撤销-Python集成开发工具Pycharm的使用方法:复制,撤销上一步.......
  14. 利用nexus搭建maven库并利用AS上传aar
  15. HDU 1429--胜利大逃亡(续)【BFS amp;amp; 状态压缩】
  16. 微服务架构的链路追踪和故障快速排查zipkin(微服务治理)
  17. android中表情功能实现,android sina 微博表情功能的实现
  18. 兄弟9020cdn提示更换粉盒_兄弟打印机提示更换墨粉盒怎么办
  19. 基于java SSM框架的竞拍系统拍卖网设计
  20. python 日程管理程序_729. 我的日程安排表(Python)

热门文章

  1. android 6.0 连接电脑,华为mate7手机EMUI4.0安卓6.0连接电脑方法
  2. 基于USBASP给AVR单片机烧写Arduino bootloader和application固件
  3. 2小时07分30秒!尘封逾15年中国马拉松国家纪录被打破 | 美通社头条
  4. win10中System占用内存、CPU过高问题的解决方法
  5. WM中Rich Text Format (RTF)格式转换 RichBox组件
  6. 深入理解反射式dll注入技术
  7. 运动用什么耳机比较好,运动蓝牙耳机推荐
  8. clickhouse集群表删除_Clickhouse 分布式表本地表
  9. Struts2--ONGL--值栈
  10. 产品升级|1月解锁50多项新功能