堆沙子问题:

设有n堆沙子排成一排,其编号为1,2,3,…,n(n≤100)。每堆沙子有一定的数量,如下表
        13 7 8 16 21 4 18
        现在要将n堆沙子归并成一堆。归并的过程为每次只能将相邻的两堆沙子堆成一堆,这样经过n-1次归并之后最后成为一堆,如上面7堆沙子,可以有多种方法归并成一堆,归并的代价是这样定义的,将两堆沙子归并为一堆时,两堆沙子数量的和称为归并2堆沙子的代价。由此可见,不同归并过程得到的总的归并代价是不一样的。
        问题:n堆沙子的数量给出之后,找出一种合理的归并方法,使总的归并代价为最小。

分析思路:

堆沙子问题只能是相邻的两堆沙子,因为这个条件,让堆沙子的过程有规律可循,问题就可以转化为如果得到两堆沙子的过程,依次往下,用f(n,m)来表示最初沙子从第n到第m合并后的值,g(n,m)表示从第n堆到第m堆的总和。我们做个简单的推演。

f(1,2)=13+7=20   f(2,3)=7+8=15

f(1,3)=f(1,2)+28=f(1,2)+g(1,3)=48

f(1,3)=f(2,3)+28=f(2,3)+g(1,3)=43

当三个合并成一个的时候就有了两种选择,先合并1,2然后3,先合并2,3然后再合并1。

f(1,4)=f(1,2)+f(3,4)+g(1,4)

f(1,4)=f(1,3)+g(1,4)

f(1,4)=f(2,4)+g(1,4)

f(n,m)是由两部分组成,一部分是两个沙堆的代价和,另一部分就是g(n,m),g(n,m)在具体的的n,m下就是定值,如果想让总代价最小,就需要两个沙堆的代价和最小。

合并情况其实也是可以找到规律的

f(n,m)=f(n,m-1)+g(n,m)

f(n,m)=f(n+1,m)+g(n,m)

f(n,m)=f(n,n+x)+f(n+x+1,m)+g(n,m)

其实合并只有这两种情况,合并好的加没有合并过的,两个合并过的相加。假如f(n,m)=f(n,n+x)+f(n+x+1,m)+g(n,m) 是f(n,m)的最小值,那么我们只要保证f(n,n+x),f(n+x+1,m)都是最小值就可以。然后依次往下找组成的最小值。但是想找最小值就必须从底层开始计算,一层一层的计算。因为不知道高层的最小情况,所以必须保证从高层计算的所有结果。但是比所有结果都算出来找最小,这种算法计算的量还是比较小的。他需要从顶向下分析,从下向上计算。

能用动态规划的情况一般都是顶层结果依赖底层结果,他们直接的是一种包含关系,但是分治法分开的小组计算的结果没有任何影响。这也是两种算法的区别。

代码实现:

public static void sand() {int[] weight = { 0, 13, 7, 8,16,21,4,18};//用一个二维数组来存储中间需要的结果int[][] sumData = new int[weight.length][weight.length];//len用来控制层数计算int len = 1;while (len < weight.length-1) {for (int i = 1; i < (weight.length - len); i++) {//计算最小值的过程int j = i + len;int min = sumData[i + 1][j];int k = i + 1;while (k < j) {int score = sumData[i][k] + sumData[k + 1][j];if (min > score)min = score;k++;}sumData[i][j] = min + sum(weight, i, j);}len++;}System.out.println(sumData[1][weight.length-1]);}

动态规划 堆沙子问题相关推荐

  1. 10堆沙子那堆沙子溶解会变色问题(二进制标记和排序标记)

    目录 问题 : 标记法 二进制标记: 排序标记: 探讨 总结 问题 : 有十堆沙子 沙子放入水中2分钟就会溶解 其中又一堆溶解会变色 现在有4个量杯 由于时间紧迫 只有两分钟时间测试 问应该如何解决? ...

  2. [剑指offer]面试题第[49]题[Leetcode][第264题][JAVA][丑数][动态规划][堆]

    [问题描述][中等] [解答思路] 1. 动态规划 时间复杂度:O(N) 空间复杂度:O(N) class Solution {public int nthUglyNumber(int n) {int ...

  3. 计蒜课中沙子的质量(动态规划)感想

    设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并的代价为这两堆沙子的数 ...

  4. ACM第一次集训 - 动态规划问题

    2018-4-15 1.石子合并问题 1)设有N堆沙子排成一排,其编号为1,2,3,-,N(N<=100).每堆沙子有一定的数量.现要将N堆沙子并成为一堆.归并的过程每次将任意两堆沙子堆成一堆( ...

  5. 中国矿业大学算法概论作业一 D、沙子的质量

    D.沙子的质量 题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将N堆沙子合并成为一堆,每次只能合并相邻的两堆,合 ...

  6. java怎么做沙子合并_dp之沙子合并 环形沙子合并 沙子合并加强 沙子三兄弟的故事...

    沙子合并加强 沙子合并问题 问题描述:设有N堆沙子排成一排,其编号为1,2,3,-,N(N<=2000).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并 ...

  7. 算法导论作业——沙子的质量

    问题 D: algorithm-沙子的质量 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有 ...

  8. 【区间dp】合并沙子

    题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并的代价为这两 ...

  9. 问题 A: 沙子的质量

    题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并的代价为这两堆 ...

最新文章

  1. 联想服务器升级微码文件,ThinkPad如何升级硬盘微码程序(适用于SL系列机器)
  2. 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解
  3. 第七届蓝桥杯省赛---蚂蚁感冒
  4. HOW TO:枚举网络所有打印机
  5. nod32Android版用户名及密码,最新nod32官方升级id和账号用户名密码
  6. ArcMap符号库 .style 和 .ServerStyle 制作过程:(对两区划定实例分析)
  7. 织梦CMS插件合集覆盖几十插件功能采集推送等
  8. CPU卡指令文件读取算法
  9. 互联网周刊:Web 3.0还有多远
  10. 相似度系列-3:传统方法ROUGE ROUGE: A Package for Automatic Evaluation of Summaries
  11. SpringBoot 实现国际化 SpringBoot配置国际化 SpringBoot 国际化 springboot实现国际化 springboot配置国际化 springboot国际化代码实现
  12. 中科大计算机学院吴雨霏,刘敏 女 博导 计算技术研究所
  13. java 登录注册小程序
  14. oracle存储过程借助utl,使用UTL_MAIL包实现存储过程邮件发送
  15. 阿里云服务器设置IPV6通过AppStore审核
  16. CLI, CILCLR
  17. 2020_WWW_The Structure of Social Influence in Recommender Networks
  18. ThinkPad适不适合计算机专业,工作也可以毫不费力 什么牌子的电脑好
  19. [转载]用VB编写一个聊天程序!
  20. 顿悟人生,一句话的人生哲理!

热门文章

  1. 安装optifine时无法正确打开jar文件 我的世界 optifine 安装 打不开 jar
  2. shell文件编辑器之sed
  3. BadCopy3.0
  4. 常用软件系列之快速搜索软件--光速搜索
  5. 仿墨迹24小时天气自定义View
  6. 计算机设备与环境安全案例,2-1计算机设备与环境安全.pptx
  7. 【Python3爬虫】破解同程旅游加密参数 antitoken-爬虫深度技术
  8. linux系统下c语言的文件读写
  9. Phython新手做网页操作自动化
  10. 无线网服务器1404代表什么,1404楼层很多人抢着买风水为什么 门牌号1404凶还是吉...