题目:有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量

和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。

输入:

第一行一个整数n(n<=100)

第二行n个整数w1,w2...wn  (wi <= 100)

输出:一个整数表示最小合并代价

这是一个比较经典的动态规划问题,对于给定的石子,当合并完后,只会剩余一堆石子,而这一堆石子是由两堆石子合并而来的。

通过倒推可以知道,第i~j堆已合并石子可以由i~k堆已合并石子与k~j堆已合并石子合并而来(i<=k<=j)。即dp[i][j]=dp[i][k]+dp[k][j]

+sum[i][j];(sum[i][j]为这堆石子的合并代价)

于是可以有

for(j=1;j<=n;j++)

{for(i=j-1;i>0;i--)

{

dp[i][j]=dp[i][i]+dp[i+1][j]+sum[i][j];for(k=i+1;k

{

dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]);

}

}

}

其中dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]);是找出第i~j堆石子合并的的最小带价。下面是全代码:

#include#include

using namespacestd;int min(int a,int b)//找出a,b的最小值。

{if(a>b) returnb;else returna;

}intmain()

{int sum[101][101],dp[101][101],w[101];

memset(sum,0,sizeof(sum));

memset(dp,0,sizeof(dp));intn,i,j,k;

cin>>n;for(i=1;i<=n;i++)//读入每个石子堆对应的代价。

{

cin>>w[i];

}for(i=1;i<=n;i++)//计算从i到j的石子堆的总代价,用sum[i][j]表示。

{

sum[i][i]=w[i];for(j=i+1;j<=n;j++)

{

sum[i][j]=sum[i][j-1]+w[j];

}

}for(j=1;j<=n;j++)//通过动态规划找出最优的代价。

{for(i=j-1;i>0;i--)

{

dp[i][j]=dp[i][i]+dp[i+1][j]+sum[i][j];for(k=i+1;k

{

dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]);//dp[i][k],dp[k+1][j]表示合成这堆石子//的前两堆石子的合并的最小代价。

}

}

}

cout<

}

实例:

输入:4

4 1 1 4

输出:18

程序分析:sum[1][1]=4,sum[1][2]=5,sum[1][3]=6,sum[1][4]=10,

sum[2][2]=1,sum[2][3]=2,sum[2][4]=6,...

dp[1][2]=5,dp[2][3]=2,dp[1][3]=8.

dp[1][2]+dp[2][3]+sum[1][3]=13

dp[1][3]=min(dp[1][3],dp[1][2]+dp[2][3]+sum[1][3])=8;

...

最后可得结果为 18,

动态规划石子排序java_动态规划之石子归并相关推荐

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

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

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

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

  3. 石子合并(动态规划DP)

    时限: 1000ms 内存限制:10000K  总时限:3000ms 描述: 在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成 ...

  4. 租用游艇问题 石子合并问题 动态规划实验

    实验名称:动态规划 一.实验预习 1.实验目的 1. 理解并掌握动态规划方法的设计思想: 2. 提高应用动态规划方法解决问题和设计算法的能力: 3. 通过编程实现租用游艇问题和石子合并问题,进一步理解 ...

  5. 【算法】动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

    文章目录 一.动态规划场景 二.动态规划分类 1.坐标型动态规划 2.前缀划分型动态规划 3.前缀匹配型动态规划 4.区间型动态规划 5.背包型动态规划 一.动态规划场景 动态规划 动态规划使用场景 ...

  6. 动态规划生产存储matlab,动态规划方法的matlab实现及其应用

    <动态规划方法的matlab实现及其应用>由会员分享,可在线阅读,更多相关<动态规划方法的matlab实现及其应用(6页珍藏版)>请在人人文库网上搜索. 1.动态规划方法的动态 ...

  7. 动态规划走楼梯_动态规划问题为什么要画表格?

    ❝ 本文是我的 91 算法第一期的部分讲义内容.91 算法第一期已经接近尾声,二期的具体时间关注我的公众号即可,一旦开放,会第一时间在公众号<力扣加加>通知大家. ❞ 动态规划可以理解为是 ...

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

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

  9. 排序(下)---快排、归并

    排序(下)-快排.归并 快速排序 采用分治的思想:每次选区一个数作为基准,让整个数据中凡是大于此数的放在此数的右边,小于此数的放在此数的左边,然后进行对此数的两边进行选基准,如上方式的分法,递归下去, ...

最新文章

  1. BeanUtils 是用 Spring 的还是 Apache 的好?
  2. linux学习——大话linux网络
  3. oracle 最低要求吗,神谕Oracle配置要求高吗?最低及推荐配置一览
  4. Python中通过PyPDF2实现PDF添加水印
  5. XSS (跨站脚本攻击) 分析与实战
  6. 07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)
  7. 2009年5月软件设计师考前预测试题及考点解析
  8. 推荐一个前端ui框架:SuperUI ui开发框架
  9. 5月17日 AJAX之JSON
  10. Android Studio实现简单的图书馆订座系统
  11. VBXtraLib 1.0 下载
  12. android 微信文件存储,安卓微信文件存储位置
  13. matlabsvd提取特征值_matlab特征值分解和奇异值分解
  14. ODM、JDM、OEM、OBM
  15. 拉着老公,逛了一趟绿源电动车连锁店,喜提新座驾。
  16. 关于length与length()
  17. Linux/Android——usb触摸屏驱动 - usbtouchscreen (一)
  18. android系统recovery模式,Android系统Recovery模式中文详细说明
  19. 二次剩余问题x的求解及代码实现(python)
  20. ARLocation使用说明

热门文章

  1. 分裂的史莱姆(二进制)
  2. c语言和java哪个好学_学java前要学C语言吗?java和C语言哪个好学?
  3. Android桥方法设置GPS信号,android-GPS更新间隔更快,信号良好?
  4. MySQL 运维 - 从零开始学习 | 超详细
  5. C语言基础---3.格式化输出总结---%d ,%s,%f %.3f,%m.ns 以及sprintf函数
  6. C++11 智能指针shared_ptr一篇足以
  7. 微博蓝V认证怎么做?(微博企业认证)
  8. 关于调用第三方sdk
  9. Unity Shader LOD详解
  10. Hard-Margin SVM(支持向量机)