动态规划石子合并问题
2017-05-03 23:25
211 查看
问题描述:在一个圆形操场的四周摆放着n堆石子,现要将石子有次序的合并成一堆。每次只能选择相邻的2堆石子合并成新的一堆,并将新的一对石子数记为该次合并的得分。
求 最小值和最大值
in:
4
4 4 5 9
out:
43
54
1.首先考虑 石子是环形摆放
所以可以 将数组存放成 4 4 5 9 4 4 5
2.然后从局部最优求到全局最优其中采用2个数组来储存 运算过程用到的数据
m**用来储存合并后石子的数量
result**用来储存得分
以上就是最大值的求法
最小值 和最大值求法稍微有些不同
不过基本思路差不多
直接看代码
写的很乱还能继续优化。
代码没有经过更多的数据测试,第一次写博客。有错误还希望看到的小伙伴能够指出。
在写代码的时候还想到了另外一种思路
可以节省一些空间
是不是可以利用 左下角空出来这一块 来存储数据
这样就不用去申请 2*n-1的空间了
只需要申请n的空间了
不过并没有详细的去思考
求 最小值和最大值
in:
4
4 4 5 9
out:
43
54
1.首先考虑 石子是环形摆放
所以可以 将数组存放成 4 4 5 9 4 4 5
2.然后从局部最优求到全局最优其中采用2个数组来储存 运算过程用到的数据
m**用来储存合并后石子的数量
result**用来储存得分
void maxdynamic(int *p, int n, int **m,int**result) {//n为数组个数 for (int i = 0; i < 2*n-1; i++) { m[i][i] = p[i];//m存放没堆石头的个数 result[i][i] = 0;//存放分数 } for (int r = 2; r <= n*2-r; r++)//这里 r<n*2-r 可以改成 r<n 减少运算次数 for (int i = 0; i <n; i++) { int j = i + r - 1;//左值:i 右值:j 宽度:r for (int k = i; k < j; k++) {//假设k为断开的地方,计算result 和m int t = m[i][k] + m[k + 1][j]+result[i][k]+result[k+1][j];//左边+右边+之前分数 if (t >result[i][j]) {//判断大小 m[i][j] = m[i][k]+m[k+1][j]; result[i][j] = t; } } } }
以上就是最大值的求法
最小值 和最大值求法稍微有些不同
不过基本思路差不多
直接看代码
写的很乱还能继续优化。
void mindynamic(int *p, int n, int **m, int**result) { for (int i = 0; i < 2 * n - 1; i++) { m[i][i] = p[i]; result[i][i] = 0; } for (int r = 2; r <= n; r++) for (int i = 0; i <n*2-r; i++) {//i<n*2-r 是为了能够算完整个圆 求max的时候并不需要 还没有仔细去查看原因 int j = i + r - 1; for (int k = i; k < j; k++) {//因为是求min 所以先算一边给数组存上初值 方便比较 result[i][j] = m[i][k] + m[k + 1][j] + result[i][k] + result[k + 1][j]; m[i][j] = m[i][k] + m[k + 1][j]; } for (int k = i+1; k < j; k++) {//改变断点,求局部最优 int t = m[i][k] + m[k + 1][j] + result[i][k] + result[k + 1][j]; if (t <result[i][j]) { m[i][j] = m[i][k] + m[k + 1][j]; result[i][j] = t; } } } }
代码没有经过更多的数据测试,第一次写博客。有错误还希望看到的小伙伴能够指出。
在写代码的时候还想到了另外一种思路
可以节省一些空间
是不是可以利用 左下角空出来这一块 来存储数据
这样就不用去申请 2*n-1的空间了
只需要申请n的空间了
不过并没有详细的去思考
相关文章推荐
- 动态规划解循环石子堆合并问题
- 动态规划思想:石子合并问题
- 动态规划解石子合并问题
- 动态规划:圆形石子合并问题
- 石子合并;圈型;动态规划;重点在于处理圈型问题;代码内有算法解释;
- 石子合并的动态规划问题
- 动态规划思想:石子合并问题
- 动态规划思想:石子合并问题
- 动态规划之石子合并(2)
- 动态规划专题之石子合并
- 动态规划——洛谷1880石子合并
- 动态规划之石子合并
- 动态规划-合并石子
- zjnu1181 石子合并【基础算法・动态规划】——高级
- 动态规划之石子合并
- POJ 1179 Polygon(动态规划:类似环形石子合并)
- 动态规划之石子合并
- 普及练习场 线性动态规划 石子合并
- 合并石子(动态规划经典题)
- 石子合并的动态规划解决方案