正文之前其实动态规划老早之前就看过, 但是可惜的是印象不深,到今天彻底忘得差不多了,这两天看《算法导论》终于让我啃下了二叉搜索树和红黑树两个家伙,虽然还未曾熟练于胸,但是基本能用了。。。现在看到了动态规划,这就不得不来搞一搞了。。以一个最简单的钢条切割的示例来详解下我的收获

正文

首先发代码,这个是自底向上的版本,其他的版本不做多的解释,这个最好用最直观。#include #includeusing namespace std;int max(int a,int b){    return a>b?a:b;

}int BOTTOM_UP_CUT(int p[], int n){    int r[n];

r[0]=0;    for (int i = 1; i <= n; ++i)

{        int q=0;        for (int j = 1; j <= i && j<11; ++j)

{

q = max(q,p[j] + r[i-j]);

}

r[i] = q;

}    return r[n];

}int main(){    //输入数据

int p[11] = {0,1,5,8,9,10,17,17,20,24,30};    //输入数据

clock_t start = clock();    cout<

}

结果也是喜人:

大概的意思就是:0 段 ---> 售价:0

1 段 ---> 售价:1

2 段 ---> 售价:5

3 段 ---> 售价:8

4 段 ---> 售价:9

5 段 ---> 售价:10

6 段 ---> 售价:17

7 段 ---> 售价:17

8 段 ---> 售价:20

9 段 ---> 售价:24

10 段 ---> 售价:30

需要我们规划一个算法来解出对于任意的长度n,又怎样的切割方式来获取最大的利润?

那么,我们以自底向上的思想来考虑的话,对于任何一个长度n的钢条,最大利润下的分割方案总是由左边的一段长度i和另外一段组合(还要继续细分)长度n-i组成。假设最佳方案下的i不变,那么我们只要考虑n-i的分割方案。于是我们就可以考虑n-i长度的钢条如何切割。(至于如何确定i?当然是遍历了~)然后这么一直考虑下去,最后总归会到1这个长度的。这样的话就无法继续细分。所以我们完全有:

那么代码就很好解释了初始化r[0] = 0,这个意思是长度为0的时候总收益为0;int BOTTOM_UP_CUT(int p[], int n){    int r[n];

r[0]=0;

对于左边的i的长度,我们理所当然的从1开始算起,这样的话,就可以直接利用r[1] = max(p[1],p[1]+r[0] )算出来了。这样,当我们需要算r[2]的时候,就可以看看,到底是p[1]+r[1] 大还是p[2]+r[0]大了。。然后就这么一路平推过去。。for (int i = 1; i <= n; ++i)

{

q是在一次i分段过程中,设置的最大收益寄存器。int q=0;

这个过程就是来考察既定的左边段长i下如何获得右边n-i的最大收益的循环了。别看一开始就用上了r,但是考虑到我们的i从1开始,所以一开始只需要r[0]就可以计算出r[1],等到后面要别的了。就会发现前面已经把所有的子问题都铺垫好了。for (int j = 1; j <= i && j<11; ++j)

{

q = max(q,p[j] + r[i-j]);

}

不得不说这个q真的用的妙,初始为0的话,完全就可以视作为r[0]使用。而后每一次循环结束都会刷新它的值,也就是对于n-i这一段,如果再把它细分,每一次细分之下的结果中的最大值会放到q中去,自然而然,一轮循环下来,q就存储了r[n-i]的最大值了。。r[i] = q;

}    return r[n];

}

正文之后不缩了不缩了。。撤撤撤。。准备吃饭去了晚上还接了个音控岗的班还要去冲饮水卡。。贼恼火。。。

作者:HustWolf

链接:https://www.jianshu.com/p/7de9f30e7655

钢条分割 动态规划java_【动态规划】初识,钢条切割问题相关推荐

  1. 凑零钱动态规划java_动态规划巧解凑零钱问题 | 创作者训练营

    动态规划是运筹学中求最优解的常用手段,解决此类问题的难点在于准确归纳出状态转移方程 状态转移方程,最重要的是先找到状态,然后将「大问题」转换成「小问题」,将「全局问题」转换成「局部问题」.转换的过程用 ...

  2. 装箱问题 动态规划 java_[动态规划]装箱问题

    装箱问题(pack.cpp) [问题描述]有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. [输入样例 ...

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

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

  4. 【DP1】钢条分割详解

    [DP] 原文再续书接上一回,上一篇文章的背包讲的有点过于狭隘,我就某一类问题解释一种算法的思想:动态规划(Dynamic Programming).简称DP. 我们在生活中不免会遇到一类问题,求什么 ...

  5. 石子合并问题java_动态规划求石子合并问题

    1.问题描述 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将n堆石子合 ...

  6. 凑零钱动态规划java_凑零钱问题-动态规划回溯贪心

    编码乱码问题解释,解决Tomcat乱码的最快速有效办法.[希望能够 编码乱码问题解释,解决Tomcat乱码的最快速有效办法.[希望能够指正] 文章目录 编码乱码问题的自我理解 我们来了解下,程序的执行 ...

  7. 矩阵连乘 动态规划_Java动态规划

    1. 介绍 动态规划典型的被用于优化递归算法,因为它们倾向于以指数的方式进行扩展.动态规划主要思想是将复杂问题(带有许多递归调用)分解为更小的子问题,然后将它们保存到内存中,这样我们就不必在每次使用它 ...

  8. 动态规划备忘录方法Java_动态规划和备忘录法的区别

    动态规划算法的基本要素:1最优子结构性质当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质.2重叠子问题性质动态规划算法对每个问题只解一次,将其解保存在一个表格中,当再次需要解此问题时 ...

  9. 买书动态规划java_《编程之美》买书问题——动态规划

    问题描述: 在节假日的时候,书店一般都会做促销活动.由于<哈利波特>系列相当畅销,店长决定通过促销活动来回馈读者.上柜的<哈利波特>平装本系列中,一共有五卷.假设每一卷单独销售 ...

最新文章

  1. Hibernat之关系的处理多对多
  2. SetBkMode函数用法详解
  3. VTK:创建一棵树并标记顶点和边用法实战
  4. 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类
  5. 生命不能承受之轻——沉重的眼泪
  6. Python批量提取docx格式Word文档中所有文本框内的文本
  7. python的networkx 算法_python图算法库Networkx笔记 - Node and Centrality
  8. 今天修了一个bug,关于debug日志的问题
  9. 超市管理系统数据库设计
  10. Apache 报错指定的网络名不再可用解决方案
  11. 如何理解惯性问题,是物理学的大问题
  12. cv2读出来的图片的颜色通道是bgr
  13. 武汉大学计算机学院期末考试时间,【通知公告】关于2018-2019学年第二学期期末考试工作安排的通知...
  14. 什么是端口映射?本文详尽解析!
  15. python之直方图统计作图
  16. Python报错 TypeError: super(type, obj): obj must be an instance or subtype of type
  17. 苹果mac启动台变成问号_如何删除MacOs启动台(应用)残留的图标
  18. Halide示例学习一
  19. 成都服务器销售熊掌号,百度熊掌号主页可以做产品词排名吗
  20. thinkcmfx漏洞太大_thinkcmf漏洞集合

热门文章

  1. Linux进程调度:完全公平调度器 Completely Fair Scheduler 内幕| linux-2.6
  2. 带有LLVM的eBPF组件
  3. MongoDB-概述:跨平台的面向文档的高性能高可用性易扩展数据库
  4. 用DPDK rte_ring实现多进程间通信
  5. Linux 下的进程间通信:管道、消息队列、共享文件、共享内存
  6. srsLTE源码学习:RRC:(Radio Resource Control):无线资源控制协议
  7. python gui编程 自动化框架_使用Python进行GUI操作自动化
  8. animation 先执行一次 在持续执行_FANUC机器人:先执行指令功能/后执行指令功能介绍与使用方法...
  9. Spring Boot 学习之,数据库三 ,事务
  10. php获取微信小程序用户头像,微信小程序获取用户头像+昵称+openid,小程序登录!附前端后端源码!...