HRBUST - 1819 石子合并问题--圆形版(区间dp+环形+四边形优化)
石子合并问题--圆形版
在圆形操场上摆放着一行共n堆的石子。现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请编辑计算出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。
Input
输入有多组测试数据。
每组第一行为n(n<=100),表示有n堆石子,。
二行为n个用空格隔开的整数,依次表示这n堆石子的石子数量ai(0<ai<=100)
Output
每组测试数据输出有一行。输出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。 中间用空格分开。
Sample Input
3
1 2 3
Sample Output
9 11
#include<bits/stdc++.h>
#define MAX 205
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll; int a[MAX],sum[MAX];
int dp1[MAX][MAX],dp2[MAX][MAX];
int s[MAX][MAX]; int main()
{
int n,len,i,j,k;
while(~scanf("%d",&n)){
memset(dp1,INF,sizeof(dp1));
memset(dp2,,sizeof(dp2));
memset(s,,sizeof(s));
memset(sum,,sizeof(sum));
for(i=;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];
dp1[i][i]=;
s[i][i]=i;
}
for(i=n+;i<*n;i++){ //环形处理
sum[i]=sum[i-]+a[i-n];
dp1[i][i]=;
s[i][i]=i;
}
for(len=;len<=n;len++){
for(i=;i<*n-;i++){
j=i+len-;
if(j>*n-) break;
for(k=s[i][j-];k<=s[i+][j];k++){ //四边形优化求最小
if(dp1[i][j]>dp1[i][k]+dp1[k+][j]+sum[j]-sum[i-]){
dp1[i][j]=dp1[i][k]+dp1[k+][j]+sum[j]-sum[i-];
s[i][j]=k;
}
}
for(k=i;k<j;k++){
if(dp2[i][j]<dp2[i][k]+dp2[k+][j]+sum[j]-sum[i-]){
dp2[i][j]=dp2[i][k]+dp2[k+][j]+sum[j]-sum[i-];
}
}
}
}
int minn=INF,maxx=;
for(i=;i<=n;i++){
minn=min(minn,dp1[i][i+n-]);
maxx=max(maxx,dp2[i][i+n-]);
}
printf("%d %d\n",minn,maxx);
}
return ;
}
HRBUST - 1819 石子合并问题--圆形版(区间dp+环形+四边形优化)的更多相关文章
- HRBUST 1819 石子合并问题--圆形版
石子合并问题--圆形版 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HRBUST. Original ...
- HRBUST 1818 石子合并问题--直线版
石子合并问题--直线版 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HRBUST. Original ...
- CSU 1592 石子合并 (经典题)【区间DP】
<题目链接> 题目大意: 现在有n堆石子,第i堆有ai个石子.现在要把这些石子合并成一堆,每次只能合并相邻两个,每次合并的代价是两堆石子的总石子数.求合并所有石子的最小代价. Input ...
- NYOJ 石子合并(一)(区间DP)
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 题目大意: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆 ...
- 石子合并/能量项链【区间dp】
题目链接:http://www.51mxd.cn/problem.php-pid=737.htm 题目大意:给出n个石子堆以及这n个石子堆中石子数目,每次操作合并两个相邻的石子堆,代价为两个石子堆数目 ...
- NYOJ 石子合并(一) 区间dp入门级别
描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价 ...
- 以石子合并为例的区间DP
区间DP,是一类具有较为固定解法的DP,一般的思路都是: first.初始化区间长度为1的情况(一般区间长度为1的较易于初始化) second. for(枚举区间长度2~n){ for(枚举左端点){ ...
- nyoj737 石子合并(一) 区间DP
dp[x][y]表示合并[x, y]区间的石子的最小花费,将区间长度递增枚举即可. AC代码: #include<cstdio> #include<algorithm> usi ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
随机推荐
- android菜鸟学习笔记11----Intent的两点补充
关于Intent的两点补充: 1.隐式Intent启动组件,会有一个Intent解析的过程,若找不到能够处理该Intent的组件,程序就会异常终止.一个合理的做法是,在使用Intent实例启动组件如: ...
- C#根据Type获取默认值
简单的获取某变量类型的默认值 在c#中为我们提供了default(),但是default的参数是具体的类名, 如何根据变量类型的Type获取默认值Code如下: 1 public static obj ...
- synchronized同步关键字
参考:http://blog.csdn.net/luoweifu/article/details/46613015 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: ...
- 【24题】P2766最长不下降子序列问题
网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...
- Objective-c中的delegate浅析
delegate初探 在ios开发中,我们常常会用到类似例如以下的对话框: 因此,例如以下这段代码我们也就非常熟悉了: - (IBAction)showSheet:(id)sender { UIAct ...
- django 设置静态文件,static
django 设置静态文件,static 一.搜集静态文件 1.1 命令行查看 collectstatic guoguos-MacBook-Pro:mysite guoguo$ python mana ...
- Java分支循环结构
一.Java分支结构 1.if语句:一个 if 语句包含一个布尔表达式和一条或多条语句. if 语句的用语法如下: if(布尔表达式){ 如果布尔表达式为true将执行的语句 } public c ...
- angularJs自定义模块
<script type="text/javascript"> var myApp = angular.module("myApp",[]); my ...
- openstack多region介绍与实践
版权声明:本文为原创文章,转载请注明出处. 概念介绍 所谓openstack多region,就是多套openstack共享一个keystone和horizon.每个区域一套openstack环境,可以 ...
- java开发环境搭建-1
安卓开发所需软件: JDK Eclipse Android-Sdk ADT 其中jdk的下载和安装,详细见http://www.cnblogs.com/zhuxiaohui/p/3620685.htm ...