nyoj 石子合并(一) 737 (DP)
2015-11-16 14:12
267 查看
石子合并(一)
时间限制: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
#include<stdio.h> #include<string.h> #include<algorithm> #define INF 0x3f3f3f using namespace std; int dp[210][210]; int a[210]; int sum[210]; int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF) { sum[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } memset(dp,0,sizeof(dp)); for(i=n;i>=1;i--) { for(j=i+1;j<=n;j++) { int tmp=INF; for(k=i;k<j;k++) tmp=min(tmp,dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); dp[i][j]=tmp;//从i合并到j所用的最少的钱。 } } printf("%d\n",dp[1] ); } return 0; }
相关文章推荐
- spark streaming updateStateByKey 用法
- Android日志打印与处理 UncaughtExceptionHandler 提交服务器
- C语言的位运算的优势
- App内存性能优化
- 硬币找零(完全背包)
- 设置让TortoiseGit记住账号和密码
- Meta 的两个 相关属性
- SQLite学习笔记(九)&&pager模块
- win7磁盘盘符怎么更改?win7更改盘符方法分享
- cpwd.sh
- 《Erlang 程序设计》练习答案 -- 第七章 二进制型与位语法
- entity framework code first 常用命名
- git 提示Push错误“Error writing request body to server”
- [LeetCode]题解(python):054-Spiral Matrix
- 50个photoshop网页设计教程-整体布局篇
- vba 字符串换行的几种方法
- jQuery 取值、赋值的基本方法整理
- 控制kobuki底盘(二)
- 使用Storm和Trident进行实时趋势分析(一)
- C语言中的位运算有什么优点?