动态规划01-钢条切割问题_钢条切割问题-动态规划状态转移方程-程序员宅基地

技术标签: 动态规划  Keson's Think  

动态规划(dynamic programming)与分治算法相似,都是通过组合子问题的解来求解原问题。区别在于,分治算法是将原问题划分为互不相交的子问题,递归求解子问题,再把它们的解组合起来,求出原问题的解;动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子问题(子问题的求解是递归进行的,将其划分为更小的子子问题),在这种情况下,分治算法会反复求解那些公共的子问题,而动态规划算法对每个子子问题只求解一次,将其保存在一个表格中,从而无需每次都求解一个子问题都重新计算,查表即可。
动态规划通常用来求解最优化问题,通常按以下4个步骤来设计一个动态规划算法:
(1)刻画一个最优解的结构特征
(2)递归地定义最优解的值
(3)计算最优解的值,通常采用自低向上的方法
(4)利用计算出的信息构造一个最优解
我们应用动态规划的第一个例子是钢条切割的问题:

长度i 1 2 3 4 5 6 7 8 9 10
价格 1 5 8 9 10 17 17 20 24 30

钢条切割问题是这样的:
给定一段长度为n英寸的钢条和一个价格表 pi ,求钢条的切割方案,使得销售收益 rn 最大。
问题定义为:

rn=max(pn,r1+rn1...,rn1+r1))

注意到,为了求解规模为n的原问题,我们先求解形式完全一样,但规模更小的子问题,我们通过组合两个子问题的最优解,并在所有可能的两段切割方案中选取组合收益最大者,构成原问题的最优解,我们称此满足最优子结构性质:问题的最优解由相关子问题的最优解组合而成,而这些子问题可以独立求解。

直接的求解方法为:

CUT-ROD(p,n)
  if n==0
    return 0
  q=INT_MIN
  for i=1 to n
    q=max(q,p[i]+CUT-ROD(p,n-i))
  return q

这种直接的方法的问题在于对相同的子问题进行了多次求解,运行时间为 2n1
动态规划方法会仔细安排求解顺序,对每个子问题只求解一次,并将其结果保存下来,如果随后再次需要此子问题的解,只需查找保存的结果,而不必重复计算。一般,我们采用自底向上(bottom-up)的方法

vector<int> steelCut(vector<int> &p,int n){
    vector<int> ret(n+1,0);
    for(int j=1;j<=n;j++){
        int q=INT_MIN;
        for(int i=1;i<=j;i++)
            q=std::max(q,p[i]+ret[j-i]);
        ret[j]=q;
    }
    return ret;
}

动态规划最最重要的两个问题是状态和状态转移方程!!状态ret[i]表示长度为i的钢条的最大效益!
状态转移方程就是

q=std::max(q,p[i]+ret[j-i])

其中ret[j-i]中保存的就是比j规模小的问题的解,这样可以避免重复求解!

总结:
动态规划问题的两个性质是
1.为了求解规模为n的原问题,我们先求解形式完全一样,但规模更小的子问题,我们通过组合两个子问题的最优解,并在所有可能的两段切割方案中选取组合收益最大者,构成原问题的最优解,我们称此满足最优子结构性质
2.子问题存在重叠,可通过自底而上求解子问题并保存结果来避免重复计算

动态规划对应最重要的两个关键点是:
1.状态方程
2.状态转移方程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kesonyk/article/details/51353462

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法