石子合并(一)
来源:互联网 发布:linux u盘启动盘工具 编辑:程序博客网 时间:2024/05/18 01:08
石子合并(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
- 输入
- 有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 - 输出
- 输出总代价的最小值,占单独的一行
- 样例输入
31 2 3713 7 8 16 21 4 18
- 样例输出
9239
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <vector>#include <map>#include <cmath>#include <stdlib.h>using namespace std;const double PI = acos(-1.0);const double eps = 0.1;const int MAX = 210;const int mod = 1e9+7;int dp[MAX][MAX];int a[MAX], n, sum[MAX];int main(){ while(~scanf("%d", &n)) { memset(sum, 0, sizeof(sum)); for(int i = 1; i<=n; ++i) { scanf("%d", &a[i]); sum[i] = sum[i-1]+a[i]; } for(int l = 1; l<n; ++l) for(int i = 1; i+l<=n; ++i) { int j = i+l; dp[i][j] = mod; for(int k = i; k<j; ++k) dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); } printf("%d\n", dp[1][n]); }}
0 0
- 石子合并(一)
- 石子合并(一)
- 石子合并(一)
- 石子合并(一)
- 石子合并(一)
- 石子合并(一)
- 石子合并(一)
- 石子合并(一)
- 石子合并(一)
- NYOJ737石子合并(一)
- NYOJ737石子合并(一)
- nyoj737 石子合并(一)
- NYOJ 373 石子合并(一)
- Nyoj 737 石子合并(一)
- 南阳737 石子合并(一)
- NYOJ 737 石子合并(一)
- 石子合并(一)+经典问题
- nyoj737石子合并(一)【区间dp】
- Spring读取properties文件出现乱码的解决方法
- BZOJ 1058: [ZJOI2007]报表统计 STL 维护全局和局部最优值
- angular.foreach 循环方法使用指南
- 常用命令行
- coredata 封装
- 石子合并(一)
- (转)GitHub上README写法暨GFM语法解读
- Linux 常用命令 之 http请求命令 curl
- oralce与mysql分别获取当前系统时间
- 数组指针和指针数组的区别
- C++ STL : advance
- CentOS7安装单机版Hadoop2.7.3
- 配置Oracle 11g Active Dataguard
- ubuntu挂载win共享的文件夹