石子合并问题--直线版
2011-08-31 12:49
330 查看
在一条直线上摆着N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为将的一堆石子的数量。设计一个算法,将这N堆石子合并成一堆的总花费最小(或最大)。
这题类似矩阵连乘,用动态规划解决。
代码如下:
输入文件: in.txt
10
2 4 5 6 4 10 3 6 8 1
输出结果:
min combination :161
Press any key to continue
这题类似矩阵连乘,用动态规划解决。
代码如下:
#include <iostream> #include <fstream> #include <deque> #include <algorithm> using namespace std; ifstream fin("in.txt"); #define max 20 int sum[max][max]; int m[max][max]; int a[max]; int StonesMergerLine(int begin,int end) { if(m[begin][end])return m[begin][end]; if(begin==end)return 0; if(begin+1==end)return sum[begin][end]; int min = 1000,t; for(int i=begin;i<end;i++) { m[begin][i] = StonesMergerLine(begin,i); m[i+1][end] = StonesMergerLine(i+1,end); t = m[begin][i]+m[i+1][end]; if(min > t) //求最小值 用 > ; 最大值用 < { min = t; } } return min+sum[begin][end]; } int main() { memset(sum,0,sizeof(int)*max*max); memset(m,0,sizeof(int)*max*max); memset(a,0,sizeof(int)*max); int n; fin>>n; int i,j; for(i=0;i<n;i++) { fin>>a[i]; sum[i][i]=a[i]; } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) sum[i][j]=sum[i][j-1]+a[j]; m[0][n-1] = StonesMergerLine(0,n-1); cout<<"min combination :"<<m[0][n-1]<<endl; return 0; }
输入文件: in.txt
10
2 4 5 6 4 10 3 6 8 1
输出结果:
min combination :161
Press any key to continue
相关文章推荐
- Hrbust 1818 石子合并问题--直线版【区间dp】
- 算法设计与分析习题3-3 石子合并问题直线排列最大得分
- 石子合并问题--直线版 (区间DP)
- 石子合并问题(直线版)
- Hrbust 1818 石子合并问题--直线版(区间DP)
- hrbust1818 石子合并问题--直线版 (经典区间DP)
- HRBUST 1818 石子合并问题--直线版
- 石子合并问题--直线版(矩阵相乘)
- 动态规划 java 石子问题(直线)
- 石子合并问题
- 石子合并问题
- 石子合并问题分析(转)
- Hrbust 1819 石子合并问题--圆形版【环形区间Dp】
- 石子合并问题
- 区间dp讲解之石子合并问题 区间dp的分析方法
- 石子合并问题
- ccf 2016-12-4 压缩编码 石子合并问题
- 石子合并问题(动态规划)
- 石子合并问题
- 石子合并问题