nyoj-737--石子合并(一)(动态规划)
2015-11-18 18:07
148 查看
石子合并(一)
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
输入有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开输出输出总代价的最小值,占单独的一行样例输入
3 1 2 3 7 13 7 8 16 21 4 18
样例输出
9 239
来源经典问题上传者
TC_胡仁东
/*dp数组中存放合并i--j所需要的最少代价,局部最优达到整体最优,刚开始 从一个到两个*/ #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAX 0x3f3f3f int dp[210][210]; int a[210]; int sum[210]; int main() { int n; while(scanf("%d",&n)!=EOF) { memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } memset(dp,0,sizeof(dp)); for(int i=n;i>=1;i--) { for(int j=i+1;j<=n;j++) //i和j固定了起点和终点,k相当于节点,通过变换k来达到i--j最优 { int temp=MAX; for(int k=i;k<j;k++)//k!=j,因为同一堆石子不能合并 temp=min(temp,dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); dp[i][j]=temp; } } printf("%d\n",dp[1] ); } return 0; }
相关文章推荐
- TCP连接三次握手
- docker-registry server部署
- Win7如何搜索文件里包含的文字
- 关于位运算——状态压缩DP预备知识
- 陈独秀在五四运动和建立中国共产党过程中的作用
- tableView的懒懒的跳转方式,加载数据源方式
- Java面向对象编程学习
- 基于项目需求开发JMeter插件
- Python——while和for循环
- 高德地图开发【覆盖物显示——Marker的使用(一)】
- android 键盘与输入框问题
- 我的第一篇博客
- 阿里云服务器ubuntu安装java运行环境
- jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定
- 色情图片识别
- 【工业4.0时代,怎样为孩子筹备未来的教育?】有感
- 17个提升iOS开发效率的必用工具
- 学习html5的WebSocket连接
- Implement strStr()
- Jquery Ajax处理,服务端三种页面aspx,ashx,asmx的比较