关于钢条切割问题的具体描述请看下面的博客:

http://www.cnblogs.com/tgycoder/p/4980655.html

写的很不错,基本把算法导论上的这一章的精华都写出来了,我也贴出我的代码,基本和书上差不多,只是把伪代码转化为可以运行的C++代码,代码转换的过程中也加深了对算法的理解。

代码如下:

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;int p[] = { 0,1,5,8,9,10,17,17,20,24,30 };  //钢条价格表/*自顶向下递归实现钢条切割问题*/
int Cut_Rod(int p[], int n)
{if (n == 0){return 0;}int q = -65535;    //此变量记录最大收益for (int i = 1; i <= n; i++){q = max(q, p[i] + Cut_Rod(p, n - i));}return q;
}/*自顶向下带记录递归实现钢条切割问题*/
int Memoized_Cut_Rod_Aux(int *p, int n,int r[])
{int q;if (r[n] >= 0)return r[n];if (n == 0)q = 0;else{q = -65535;for (int i = 1; i <= n; i++){q = max(q, p[i] + Memoized_Cut_Rod_Aux(p, n - i, r));}}r[n] = q;return q;}int Memoized_Cut_Rod(int *p,int n)
{int r[11];   //此处改为动态分配内存比较好for (int i = 0; i <= n; i++){r[i] = -65536;}return Memoized_Cut_Rod_Aux(p, n, r);
}/*自底向上实现钢条切割问题*/
int Bottom_up_Cut_Rod(int p[], int n, int s[])
{int r[11];//int s[11];   //用来记录具体的切割方案r[0] = 0;for (int j = 1; j <= n; ++j){int q = -65535;for (int i = 1; i <= j; ++i){if (q < p[i] + r[j - i]){q = p[i] + r[j - i];s[j] = i;}}r[j] = q;}return r[n];
}void print_sn(int *s,int n)
{while (n > 0){cout << s[n];n = n - s[n];}cout << endl;
}int main()
{//cout << Cut_Rod(p, 7) << endl;//cout << Memoized_Cut_Rod(p, 7) << endl;int *s = new int[11];   //用来记录具体的分割方案cout << Bottom_up_Cut_Rod(p, 9,s) << endl;print_sn(s, 9);return 0;
}

  第一次接触动态规划,我认为动态规划的关键在于可以解决子问题重叠的情况,即不同的子问题具有公共的子子问题,动态规划对其中的子子问题只求解一次,并把结果保存下来,避免做相同的工作,这可以大大提高算法的性能。

总结:结合动态规划的算法设计步骤来说,钢条切割问题也是遵守其标准的。

第一步先确定最优化解的结构特征:最优切割方案是由第一次切割后得到的两段钢条的最优切割方案组成的,或者是第一次切割后,其右端剩余部分的最优切割方案组成的。

第二步递归定义最优解的值,由上面的分析我们可以得到rn = max(pn,r1+rn-1,r2+rn-2,…,rn-1+r1)和rn = max(pi + rn-i) 两个最优解的公式,其满足求得原问题最优解的条件。

第三步根据得到的求最优解公式,计算出结果。我们用到了两种方法:带备忘的自顶向下递归法和自底向上法(非递归)。

第四步构造出最优解。

好久没有写博客了,期间发生了一些事扰乱了计划,现在要重新回归算法,为明年的华为算法比赛准备

good luck to me

夜深了,时间不多了

转载于:https://www.cnblogs.com/1242118789lr/p/7397850.html

动态规划解决分割问题相关推荐

  1. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  2. 最大子段和动态规划_动态规划解决最大正方形问题

    今天的问题 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 来 ...

  3. 用动态规划解决最长公共子序列

    要求:最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S ...

  4. c++动态规划解决一系列数中互不相邻数字之和的最大值

    c++动态规划解决一系列数中互不相邻数字之和的最大值 问题描述 解决思路 C++代码编写 运行结果 问题描述 给定一系列数字{1,2,4,1,7,8,3},要求其中互不相邻的数字之和的最大值. 解决思 ...

  5. 动态规划解决0-1背包问题详解(图文并茂)

    动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...

  6. 动态规划解决最长公共子序列

    动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...

  7. 动态规划解决01背包问题

    转自:https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 一.问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包 ...

  8. 萌新做点小玩意儿DAY-4 动态规划解决多边形游戏

    还是先简单的介绍一下动态规划的算法思想,跟分治法的思想相似的是把一个比较大的问题分解成若干子问题,而分治法分解出来的子问题都是相同规模有相同的解决办法的,动态规划可以通过空间换时间来解决这些相同的问题 ...

  9. 动态规划解决背包问题

    动态规划解决背包问题 问题描述: (1)解法一: 解决思路:动态规划 状态索引范围:从1开始 价值数组,大小数组索引范围:从0开始 状态:F(i,j):前i个物品放入大小为j的背包中所获得的最大价值. ...

  10. 动态规划解决矩阵连乘问题

    动态规划解决矩阵连乘问题 文章目录 动态规划解决矩阵连乘问题 动态规划 1.要素 2.基本思想 3.适用于解最优化问题步骤 一.矩阵连乘问题 规则 矩阵可乘的条件 计算的次序对计算量的影响 二.动态规 ...

最新文章

  1. RxJava debounce()和throttleWithTimeout()
  2. 【调侃】IOC前世今生
  3. Android4.0 Design之设计规范的十大革新
  4. NFS挂载失败(Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0))
  5. php的内存划分,解析PHP中的内存管理,PHP动态分配和释放内存
  6. TensorFlow 2.0不好用?会了是“真香”!
  7. android 录像实时传送,Android中实时视频传输(摄像头实时视频传输)解决方案
  8. java webservice 常用_复杂对象类型的WebService高级部分
  9. sales organization mapping logic debug
  10. 如何摆脱「技术思维」的惯性?
  11. linux lp 打印中文,Linux基础命令---lp打印文件
  12. vscode vim快捷键失效_VIM真的好用吗?到底要不要学习VIM?
  13. c语言处理机调度实验报告,操作系统实验处理机调度C语言实现.docx
  14. Html5 h5页面输入框失去焦点页面底部白板问题
  15. win7设置自动开机时间_win7本地连接ip设置方法
  16. 一文带你认识HTML
  17. 解决树莓派4B从USB启动的问题
  18. 网上找的更具纬度经度算计两点之间的距离,得到的结果不准确, 小程序获取用户位置信息返回的纬度经度与实际位置不正确。
  19. 智课雅思词汇---二十七、形容词后缀-ant/-ent
  20. 云端守望者(上):十二道难关

热门文章

  1. 客户端中转request请求乱码
  2. 极限运动:街头极限单车,不只是牛逼!
  3. 在ASP.NET应用启动的时候初始化的几种方法
  4. treebagger matlab,MATLAB – TreeBagger example
  5. 手机能识别sim卡但是没信号_一篇文章扫盲手机SIM卡相关知识
  6. unity改变物体轴心
  7. truncate table 与delete table区别
  8. au6258引脚图及功能_电解电容引脚图/封装
  9. Collectors.toList()
  10. python顺序查找算法解释_顺序查找算法详解(包含C语言实现代码)