动态规划与钢条切割

1.分治算法与动态规划

相同点:

都是通过组合子问题的解来求解原问题

不同:

1.分治将问题划分为互不相交的子问题,递归地求解子问题,在将它们的解组合起来,求出原问题。

2.动态规划应用于子问题重叠的情况,即不同的子文问题具有公共的子问题。(这种情况下,分治会反复求解那些共子问题,而动态规划将每个子问题的解保存在表格中,从而无需重复计算子问题)

2.钢条切割

问题:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,3,…,n)p_i(i=1,2,3,…,n)pi​(i=1,2,3,…,n),求切割钢条的方案使收益最大

设计动态规划的过程:

  • 刻画一个最优子结构的特征–>递归地定义最优解的值–>计算最优解的值(通常使用自底向上的方法)

    –>利用计算的信息构造最优解

  • 切割方案:2n−12^{n-1}2n−1

    在距离钢条左端i(i=1,2,3,…,n)i(i=1,2,3,…,n)i(i=1,2,3,…,n)处,我们总可以选择切割或不切割

  • 描述切割“长度为n的钢条”的最大收益 rnr_nrn​(刻画一个最优解的结构特征)

    设最优解将钢条切割成k段,最优切割方案为: n=i1+i2+i3+…ikn=i_1+i_2+i_3+…i_kn=i1​+i2​+i3​+…ik​,

    则有最大收益: rn=pi1+pi2+…+pinr_n=p_{i_1}+p_{i_2}+…+p_{i_n}rn​=pi1​​+pi2​​+…+pin​​

  • 利用更短的钢条的最优切割来描述rnr_nrn​: (递归地定义最优解的值)

    rn=max(pn,r1+rn−1,r2,rn−2,…rn−1+r1)r_n=max(p_n,r_1+r_{n-1},r_2,r_{n-2},…r_{n-1}+r_1)rn​=max(pn​,r1​+rn−1​,r2​,rn−2​,…rn−1​+r1​)

    1.第一个参数对应不切割,直接出售长度为n英寸的钢条

    2.其他参数对应将钢条切成i和n-i的两端的各个切法

  • 最优子结构特征

    我们称钢条切割问题满足最优子结构的特征:问题的最优解由相关子问题的最优解组合而成,而这些子问题可以独立求解

  • 简化 rnr_nrn​的递归定义

    rn=max⁡0≤x≤n(pi+rn−i)r_n=\max_{0 \leq x \leq n} (p_i+r_{n-i})rn​=max0≤x≤n​(pi​+rn−i​)

    即钢条的切割方式为:从左边切下长度为i的一段(且不再进行切割),从右边切下长度为n-i的一段,继续进行切割。若没有切割,则第一段长度为n,收益为 pnp_npn​,第二段长度为0,收益为0;

3.自定向下递归实现

int cutRod(int price[], int n){if(n==0)return 0;int max_val = INT_MIN;for(int i=0;i<n;i++){max_val =max( max_val,p[i]+cutRod(price,n-i));} return max_val;
}

可以看到CUT-ROD反复求解重复子问题,设T(0)=1,有

利用归纳法可以证明 T(n)=2nT(n)=2^nT(n)=2n

4.使用动态规划求解

两种等价的实现方法:

  • 带备忘录的自定向下法

    此方法仍然按照自然的递归形式编写,但过程会保存每个子问题的解。当需要一个子问题的解时,过程首先检验是否保存过此解。

  • 自底向上法

    任何子问题的求解都依赖更小的子问题的求解,当求解某个子问题时,它所依赖的更小子问题都已求解完毕


#include<iostream>
#include <bits/stdc++.h>
#include<math.h>
using namespace std;// A utility function to get the maximum of two integers
int max(int a, int b) { return (a > b)? a : b;}/* Returns the best obtainable price for a rod of length n and
price[] as prices of different pieces */
int cutRod(int price[], int n)
{
int val[n+1];
val[0] = 0;
int i, j;// Build the table val[] in bottom up manner and return the last entry
// from the table
for (i = 1; i<=n; i++)
{int max_val = INT_MIN;for (j = 0; j < i; j++)max_val = max(max_val, price[j] + val[i-j-1]);val[i] = max_val;
}return val[n];
}/* Driver program to test above functions */
int main()
{int arr[] = {1, 5, 8, 9, 10, 17, 17, 20};int size = sizeof(arr)/sizeof(arr[0]);cout <<"Maximum Obtainable Value is "<<cutRod(arr, size);getchar();return 0;
}

5.子问题图

我们可以将动态规划方法的子问题图看成自定向下递归树的“收缩版”,所有相同子问题合并为同一节点。

算法导论15.1动态规划之钢条切割相关推荐

  1. 《算法导论》中动态规划求解钢条切割问题

    动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契 ...

  2. 算法导论-动态规划(钢条切割问题)

    写下文章来记录下自己学习算法导论的笔记 文章目录 写下文章来记录下自己学习算法导论的笔记 动态规划的目的 设计动态规划算法 钢条切割问题 问题描述 刻画问题结构(建立方程) 递归方程建立 带备忘录的自 ...

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

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

  4. 《算法导论》学习(十七)----动态规划之钢条切割(C语言)

    文章目录 前言 一.钢条切割问题 1.问题背景 2.问题描述 3.问题的难点 (1)情况较多 (2)消除重复子问题 二.问题解决方案 1.问题的特点 (1)最优化子结构 (2)重复子问题 2.最优化解 ...

  5. Python数据结构与算法-动态规划(钢条切割问题)

    一.动态规划(DP)介绍 1.从斐波那契数列看动态规划 (1)问题 斐波那契数列递推式: 练习:使用递归和非递归的方法来求解斐波那契数列的第n项 (2)递归方法的代码实现 import time # ...

  6. 动态规划:钢条切割问题

    一.题目 钢条切割问题 是<算法导论>一书中介绍动态规划时的一道引题.即: 某公司购买长钢条,将其切割为短钢条出售.假设切割工序没有成本支出,已知长度为 i 的钢条出售价格为 pi ,钢条 ...

  7. 【动态规划】钢条切割问题

    本人在学习<算法导论>的过程中,对于动态规划这部分的内容不是特别理解,于是决定做一下学习与解决记录,欢迎讨论交流. 文章目录 0- 动态规划问题的一般步骤 1- 问题描述 2-问题分析 3 ...

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

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

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

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

最新文章

  1. 《分布式服务架构:原理、设计与实战》第二章彻底解决分布式系统一致性的问题...
  2. Okhttp 使用与debug时留的大坑
  3. 编码utf-8的不可映射字符_MySQL 请不要使用“utf8”
  4. 二十万字C/C++、嵌入式软开面试题全集宝典九
  5. Git学习笔记------整理自廖雪峰官网教程
  6. 记不住ASP.NET页面生命周期的苦恼
  7. 免费分享老男孩全栈9期视频,共126天
  8. Tp框架中模板中if条件如何使用?
  9. 纽约州立大学石溪分校将理论物理研究所命名为“杨振宁理论物理研究所”
  10. 软件开发工程师证书有用吗_bim工程师证书有用吗
  11. Linux之cut命令
  12. 换工作,看机会的,戳进来!
  13. FX系列PLC编程手册
  14. C++中四种内存分配方式
  15. 函数间断点类型及其判别方法
  16. CSS实现抽奖大转盘
  17. 【神经网络务实:Deepin Linux 安装使用yolov5】
  18. maya RedShift 渲染报警告:细分问题
  19. 使用 IE 或Chrome等浏览器,通过网络抓包的形式,查看发送请求时的网络
  20. 特斯拉新能源汽车遍地开花 汽车品牌纷纷建立电动化品牌战略

热门文章

  1. .NET ASP.NET 页生命周期概述
  2. 全国企业信用信息公示系统 查公司信息
  3. PTA第八章7-2 统计英文单词个数
  4. 会心自选-淘宝店铺装修和转化率的关系
  5. opencv---c++
  6. 服务器修复划痕,【DIY】自己动手修复屏幕划痕及建议
  7. H7-TOOL脱机烧录器支持1拖4,支持新唐,GD32,MM32,AT32,APM32,CX32,STM32,STM8,i.MX RT,W7500,外置Flash等2020-10-27
  8. [从头读历史] 第257节 孔子和他的《春秋》 [BC537至BC479]
  9. MySQL查询与数据库设计 #万能公式 #思维导图 #MySQL查询 #数据库设计规范 #第二部分
  10. 寻找java兼职(全职)人员