[中等] 动态规划经典-堆石子问题
来源:互联网 发布:如何在淘宝卖高仿鞋 编辑:程序博客网 时间:2024/05/16 17:31
1. 问题描述:
设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=100)。每堆沙子有一定的数量。现要将N堆沙子并成为一堆。归并的过程只能每次将相邻的两堆沙子堆成一堆,这样经过N-1次归并后成为一堆。找出一种合理的归并方法,使总的代价最小。
【输入格式】
输入由若干行组成,第一行有一个整数,n(1≤n≤100);表示沙子堆数。第2至m+1行是每堆沙子的数量。
【输出格式】
一个整数,归并的最小代价。
【输入样例】
7
13
7
8
16
21
4
18
【输出样例】
239
2. 解题思路:
首先这也是一个多阶段决策问题,所以考虑采用动态规划来解。
然后研究一下每个决策(合并还是不合并)受哪个或者哪几个因素影响。本题可以看作受两个因素的影响:
(1)要决策的是第 i 堆。
(2)合并的是相邻的一堆。
如果没有(2)的话,我们可以大胆采用d[i]来存储最优值,但因为有了(2),所以这样就不行了。由(2)我们可以知道合并实际上是与两堆相关联的,所以可以根据这两堆将所有堆分成两部分,而第一部分又可以继续分下去,想到这里,便很容易设计出下面的状态转移方程:
d[i][j]=min{d[i][k]+d[k+1][j]+Wi,j},其中d[i][j]表示把第i到j堆合并成一堆的最小代价,Wi,j表示第i到第j堆的石子数量之和。
有了这个转移方程,很容易看出要按照长度(即j-i的值)进行迭代求解。
[小优化]
可以提前算出Wi,j的值,这样可以省掉一个n的时间复杂度。
具体代码可以参考:http://blog.csdn.net/abcjennifer/article/details/5805330
阅读全文
0 0
- [中等] 动态规划经典-堆石子问题
- 动态规划解循环石子堆合并问题
- 动态规划:石子合并问题
- 动态规划石子合并问题
- 动态规划经典——石子归并
- 动态规划经典——石子归并
- 合并石子(动态规划经典题)
- 动态规划经典问题
- 动态规划经典问题
- 动态规划经典问题
- 动态规划经典问题
- 动态规划经典问题
- 动态规划经典问题
- 石子合并问题 --动态规划--解法1
- 动态规划思想:石子合并问题
- 石子合并问题(动态规划)
- 石子合并问题(动态规划)
- 石子合并的动态规划问题
- 8.22 问题 B: 海岛争霸
- Android Input System分析(四)--应用层
- 引用jar包导出excel(数据透视)
- Tensorflow API: Neural network
- idea调试SpringMvc, 出现:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
- [中等] 动态规划经典-堆石子问题
- zzuli 2174 dfs
- go语言中可变参数函数
- 递推式构造列表的JavaScript实现
- 使用react-apollo+graphql实现Mutation操作
- Kafka web console安装
- Android Parcelable和Serializable的区别
- Sound Activated Recording – Setup
- 通过Xposed框架实现禁用手机录音摄像头功能(hook android 底层实现)