NYOJ 737:石子合并(一)(区间dp)
737-石子合并(一)
- 内存限制:64MB 时间限制:1000ms 特判: No
 
- 通过数:30 提交数:37 难度: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
AC代码
参考大佬博客:https://www.cnblogs.com/qq-star/p/4161143.html
/*
* @Author: WZY
* @School: HPU
* @Date:   2018-10-11 16:28:28
* @Last Modified by:   WZY
* @Last Modified time: 2018-10-11 16:54:57
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <time.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define pi acos(-1.0)
#define INF 0x7f7f7f7f
#define lson o<<1
#define rson o<<1|1
#define debug(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<"\n"
const double E=exp(1);
const int maxn=1e3+10;
const int mod=1e9+7;
using namespace std;
int dp[maxn][maxn];
int sum[maxn][maxn];
int a[maxn];
int main(int argc, char const *argv[])
{
	ios::sync_with_stdio(false);
	#ifndef ONLINE_JUDGE
	    freopen("in.txt", "r", stdin);
	    freopen("out.txt", "w", stdout);
	    double _begin_time = clock();
	#endif
	int n;
	while(cin>>n)
	{
		ms(sum,0);
		ms(a,0);
		ms(dp,INF);
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			sum[i][i]=a[i];
			dp[i][i]=0;
		}
		// 枚举长度
		for(int len=1;len<n;len++)
		{
			// 区间的起点
			for(int i=1;i+len<=n;i++)
			{
				// 区间的终点
				int j=i+len;
				// 从起点到终点进行dp
				for(int k=i;k<j;k++)
				{
					sum[i][j]=sum[i][k]+sum[k+1][j];
					dp[i][j]=min(dp[i][k]+dp[k+1][j]+sum[i][j],dp[i][j]);
				}
			}
		}
		cout<<dp[1][n]<<endl;
	}
	#ifndef ONLINE_JUDGE
	    long _end_time = clock();
	    printf("time = %lf ms.", _end_time - _begin_time);
	#endif
	return 0;
}												
											NYOJ 737:石子合并(一)(区间dp)的更多相关文章
- nyoj 737 石子合并(区间DP)
		
737-石子合并(一) 内存限制:64MB 时间限制:1000ms 特判: No通过数:28 提交数:35 难度:3 题目描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为 ...
 - nyoj  737 石子合并 经典区间 dp
		
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆 ...
 - nyoj 737 石子合并(一)。区间dp
		
http://acm.nyist.net/JudgeOnline/problem.php?pid=737 数据很小,适合区间dp的入门 对于第[i, j]堆,无论你怎么合并,无论你先选哪两堆结合,当你 ...
 - 题解报告:NYOJ #737 石子合并(一)(区间dp)
		
描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值 ...
 - nyoj 737 石子合并        http://blog.csdn.net/wangdan11111/article/details/45032519
		
http://blog.csdn.net/wangdan11111/article/details/45032519 http://acm.nyist.net/JudgeOnline/problem. ...
 - 洛谷P1880 石子合并(区间DP)(环形DP)
		
To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...
 - 直线石子合并(区间DP)
		
石子合并 时间限制:1000 ms | 内存限制:65535 KB 描述有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费 ...
 - CH5301 石子合并【区间dp】
		
5301 石子合并 0x50「动态规划」例题 描述 设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆, ...
 - zjnu 1181 石子合并(区间DP)
		
Description 在操场上沿一直线排列着 n堆石子. 现要将石子有次序地合并成一堆.规定每次仅仅能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.同意在第一次合并前对调一 ...
 - 石子合并(区间dp)
		
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程仅仅能每次将相邻 ...
 
随机推荐
- 每天进步一点点out1
			
1● attend ətend 2● infant əfənd
 - ubuntu默认启动方式修改 psensor命令
			
Check UUID sudo blkid Then sudo gedit /etc/default/grub & to pull up the boot loader configurati ...
 - RBAC功能模块
 - Django 前台通过json 取出后台数据
			
转载自:https://my.oschina.net/esdn/blog/814111 步骤1:后台数据通过 JSON 序列化成字符串 注意:1.json是1个字符串 2.通过json.dumps(' ...
 - Android Touch事件之二:dispatchTouchEvent()和onTouchEvent()篇
			
2015-12-01 15:06:14 Android Touch事件第一篇:Touch事件在父ViewGroup和子View之间的传递简单分析了事件的传递流程,这次深入了解下dispatchTouc ...
 - 运行java程序的方法-DOS命令和Eclipse方法
			
● 运行java程序的方法(使用DOS命令) 首先进行一个"文件夹选项"的设置: 在D:\Android\java_code目录下新建了一个Hello_World.java文件(不 ...
 - 深入理解java虚拟机---jdk8新特性(二)
			
1.jdk8新特性 1.新特性 2.lambda函数表达式的作用 A: 替换内部类 B:对集合的操作并行化
 - HashMap中hashCode()和equals()重要性
			
Java中HashMap根据hashCode()和equals()方法来获取键值对的索引,同时也通过这两个方法由key值获取value值.如果没有这两个方法,那么当有两个相同的 hash值时,可能会被 ...
 - FindResource () RT_HTML  为什么总是出错呢 ?
			
#include <windows.h> #include <commdlg.h> #include <ole2.h> BOOL GetHtmlResource(L ...
 - GNU C的定义长度为0的数组
			
在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在 ...