动态规划 堆沙子问题
堆沙子问题:
设有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]);}
动态规划 堆沙子问题相关推荐
- 10堆沙子那堆沙子溶解会变色问题(二进制标记和排序标记)
目录 问题 : 标记法 二进制标记: 排序标记: 探讨 总结 问题 : 有十堆沙子 沙子放入水中2分钟就会溶解 其中又一堆溶解会变色 现在有4个量杯 由于时间紧迫 只有两分钟时间测试 问应该如何解决? ...
- [剑指offer]面试题第[49]题[Leetcode][第264题][JAVA][丑数][动态规划][堆]
[问题描述][中等] [解答思路] 1. 动态规划 时间复杂度:O(N) 空间复杂度:O(N) class Solution {public int nthUglyNumber(int n) {int ...
- 计蒜课中沙子的质量(动态规划)感想
设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并的代价为这两堆沙子的数 ...
- ACM第一次集训 - 动态规划问题
2018-4-15 1.石子合并问题 1)设有N堆沙子排成一排,其编号为1,2,3,-,N(N<=100).每堆沙子有一定的数量.现要将N堆沙子并成为一堆.归并的过程每次将任意两堆沙子堆成一堆( ...
- 中国矿业大学算法概论作业一 D、沙子的质量
D.沙子的质量 题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将N堆沙子合并成为一堆,每次只能合并相邻的两堆,合 ...
- java怎么做沙子合并_dp之沙子合并 环形沙子合并 沙子合并加强 沙子三兄弟的故事...
沙子合并加强 沙子合并问题 问题描述:设有N堆沙子排成一排,其编号为1,2,3,-,N(N<=2000).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并 ...
- 算法导论作业——沙子的质量
问题 D: algorithm-沙子的质量 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有 ...
- 【区间dp】合并沙子
题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并的代价为这两 ...
- 问题 A: 沙子的质量
题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将N堆沙子合并成为一堆,每次只能合并相邻的两堆,合并的代价为这两堆 ...
最新文章
- 联想服务器升级微码文件,ThinkPad如何升级硬盘微码程序(适用于SL系列机器)
- 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解
- 第七届蓝桥杯省赛---蚂蚁感冒
- HOW TO:枚举网络所有打印机
- nod32Android版用户名及密码,最新nod32官方升级id和账号用户名密码
- ArcMap符号库 .style 和 .ServerStyle 制作过程:(对两区划定实例分析)
- 织梦CMS插件合集覆盖几十插件功能采集推送等
- CPU卡指令文件读取算法
- 互联网周刊:Web 3.0还有多远
- 相似度系列-3:传统方法ROUGE ROUGE: A Package for Automatic Evaluation of Summaries
- SpringBoot 实现国际化 SpringBoot配置国际化 SpringBoot 国际化 springboot实现国际化 springboot配置国际化 springboot国际化代码实现
- 中科大计算机学院吴雨霏,刘敏 女 博导 计算技术研究所
- java 登录注册小程序
- oracle存储过程借助utl,使用UTL_MAIL包实现存储过程邮件发送
- 阿里云服务器设置IPV6通过AppStore审核
- CLI, CILCLR
- 2020_WWW_The Structure of Social Influence in Recommender Networks
- ThinkPad适不适合计算机专业,工作也可以毫不费力 什么牌子的电脑好
- [转载]用VB编写一个聊天程序!
- 顿悟人生,一句话的人生哲理!
热门文章
- 安装optifine时无法正确打开jar文件 我的世界 optifine 安装 打不开 jar
- shell文件编辑器之sed
- BadCopy3.0
- 常用软件系列之快速搜索软件--光速搜索
- 仿墨迹24小时天气自定义View
- 计算机设备与环境安全案例,2-1计算机设备与环境安全.pptx
- 【Python3爬虫】破解同程旅游加密参数 antitoken-爬虫深度技术
- linux系统下c语言的文件读写
- Phython新手做网页操作自动化
- 无线网服务器1404代表什么,1404楼层很多人抢着买风水为什么 门牌号1404凶还是吉...