一、问题描述:

设有一根长度为L的钢条,在钢条上标有n个位置点(p1,p2,......,pn)。现在需要按钢条上标注的位置将钢条切割为n+1段,每次切割的代价为所切的钢条长度,试求在所有的切割方案中的总代价的最小值。

二、问题分析:

这是一道利用动态规划算法解决的问题,原因如下:(1)该问题具有最优子结构性质。当我们确定第一次切割的点时,切割后形成的两根小钢管也应按照最小的代价切割,否则我们拿最小代价的切割方案来代替现有切割方案,整根钢管切割的总代价将会减小,这就会产生矛盾。(2)该问题具有重叠子问题。相同的子问题会在我们确定不同切割点的时候反复出现。

三、递推关系:

我们来考察在位置点pi到位置点pj之间进行切割的情况,cost[i][j]为这个问题的总代价(i=1,2,......,n ; j=1,2,......,n),那么:

当i>j时,不需要切割:cost[i][j]=0;

当i=j时,仅有一个切割点:cost[i][j]=d(i+1)-d(i-1);

当i<j时,有多个切割点:cost[i][j]=min{cost[i][k-1]+cost[k+1][j]+d(j+1)-d(i-1)};其中k=i,i+1,......,j。

四、完整代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{int L,n;//L为完整钢管总长度,n为切割点的数目cout<<"请输入钢管总长度和切割点数目:";cin>>L>>n; int *p;//记录n个切割点位置坐标的数组p=new int[n+2];//多出来的2是钢管的左端点(起点)和右端点(终点)p[0]=0;p[n+1]=L;//将左端点视为原点int i,j,step;//i,j为简单的循环所需变量,step为i,j之间的步长 for(i=1;i<=n;i++){cout<<"请输入第"<<i<<"个切割点的位置坐标:" ; cin>>p[i];}sort(p,p+n+2);//将坐标从小到大排列int **cost=new int*[n+2];for(i=0;i<n+2;i++){cost[i]=new int[n+2];}//动态创建二维数组,cost[i][j]的意义见递推关系解释for(i=0;i<n+2;i++){for(j=0;j<n+2;j++){if(i>j){cost[i][j]=0;}else if(i==j && i!=0 && i!=n+1)//这些限制条件防止数组超界 {cost[i][j]=p[i+1]-p[i-1];}}}cost[0][0]=0;cost[n+1][n+1]=0;//额外初始化for(step=1;step<=n-1;step++){for(i=1;i<=n;i++){j=i+step;int CutPoint=i;//定义切点 int MyCostMin=cost[i][CutPoint-1]+cost[CutPoint+1][j]+(p[j+1]-p[i-1]);//定义最小代价 for(CutPoint=i+1;CutPoint<=j;CutPoint++){if(j<n+1)//防止数组越界 {int PreCost=cost[i][CutPoint-1]+cost[CutPoint+1][j]+(p[j+1]-p[i-1]);//定义当前代价 if(PreCost<MyCostMin){MyCostMin=PreCost;}}}cost[i][j]=MyCostMin;}}cout<<"需要的最小总代价为:"<<cost[1][n];
}

五、运行结果:

动态规划——钢管切割最小代价问题相关推荐

  1. 动态规划—钢管切割问题

    题目描述 给一条钢管,切割成不同长度的钢管(也可以不切割),不同的钢管长度对应不同的价值,求这根钢管获得的最大价值. 输入 第一行包含一个正整数L,为钢管的长度. 第二行包含L个正整数a1-aL,为长 ...

  2. 【算法导论】动态规划之“钢管切割”问题

    动态规划,其实跟分治法有些相似,基本思想都是将复杂的问题分成数个简单的子问题,然后再去解决.它们的区别在于,分治法关注的子问题不相互"重叠",而动态规划关注的子问题,多是相互&qu ...

  3. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Descr ...

  4. 【动态规划】最小代价问题

    最小代价问题 Description 设有一个n×m(小于100)的方格(如图所示),在方格中去掉某些点,方格中的数字代表距离(为小于100的数,如果为0表示去掉的点),试找出一条从A(左上角)到B( ...

  5. 最小代价树(动态规划)

    Description 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和.  例如:((4+1)+ (2+ ...

  6. Day2补充:钢管切割问题

    转自:https://blog.csdn.net/cyp331203/article/details/42806159 Day2补充:钢管切割问题 一. 问题背景: 某公司生产长钢管,然后一般,会将钢 ...

  7. DP之钢管切割,最长回文字符串,最长公共子串

    在做LeetCode第3题的时候,用到了DP,但是自己对DP还是不了解,所以翻开算法导论,开始看动态规划喽,学好动态规划,走遍天下都不怕. 钢管切割 对于一根长n米的钢管,每个长度的价格不一样,对于长 ...

  8. SSL 1460——最小代价问题

    Description 设有一个n×m(小于100)的方格(如图所示),在方格中去掉某些点,方格中的数字代表距离(为小于100的数,如果为0表示去掉的点),试找出一条从A(左上角)到B(右下角)的路径 ...

  9. 最小代价生成树Prim/Kruskal(c/c++)

    常用的求最小代价生成树的方法有两种:Prim算法和Kruskal算法,这两种算法都是贪心算法的应用, Prim算法 在一个无向带权图中求得最小生成树得思路是:从a顶点出发,将a放入u集合(表示已选), ...

最新文章

  1. phpstorm 10 修改背景图片和字体
  2. 7分钟了解科大讯飞开发者节:AI红利期来临,全新1024计划发布(未完待续)
  3. 给脚本添加到环境变量_让你的脚本可以在任意地方都可执行的几个方法
  4. ElasticSearch 聚合查询
  5. 分式混合运算20道题_FAG剖分式调心滚子轴承的性能
  6. 如何做漂亮实用的UI界面?UI/UX设计模板,帮你入手!
  7. 函数的参数,参数为数组
  8. formatter function (value,row,index){} 参数的含义
  9. Ajax异步刷新,测试用户名是否被注册
  10. axure 坐标扩散效果
  11. JanusGraph对于Gremlin查询语言的介绍
  12. 当直播带货回归商品销售本质?
  13. 49个excel常用技巧(三)
  14. dnf超时空漩涡副本路线流程图_DNF超时空漩涡副本怎么过_DNF超时空漩涡副本快速达成图文攻略...
  15. 《国产操作系统之银河麒麟》桌面环境
  16. Spark 第一讲 Scala安装配置
  17. 计算机硬件型号,怎样检测电脑硬件型号
  18. 烤仔观察 | 秋天的第一口“菠萝”真的那么好吃吗?
  19. 看漫画学python 怎么样_看着漫画学Python是种怎样的体验?
  20. PT100(RTD)三线制测量方案

热门文章

  1. HTML旋转相册(520表白神器)
  2. 家暴屡教不改能判刑吗
  3. 潍坊学院计算机工程学院天一楼地址,计算机演讲稿的范文.doc
  4. 接口自动化—mock服务、用例依赖
  5. Mathematica对函数表达式求导并设置为新的自定义函数
  6. SLAP(Speaker-Listener Label Propagation Algorithm)社区发现算法
  7. grok正则解析mysql slowlog
  8. 佳能Canon PIXMA MG2550 打印机驱动
  9. 番外2:ADS负载(源)牵引如何找到功率圆和效率圆圆心
  10. QT工程的pro文件详解