hdu3506 Monkey Party (区间dp+四边形不等式优化)
题意:给n堆石子,每次合并相邻两堆,花费是这两堆的石子个数之和(1和n相邻),求全部合并,最小总花费
若不要求相邻,可以贪心地合并最小的两堆。然而要求相邻就有反例
为了方便,我们可以把n个数再复制一遍,放到第n个数后,就不用考虑环的问题了
我们设f[i][j]为合并区间[i,j]所需要的最小花费,然后就可以得到
f[i][j]=min{f[i][k]+f[k+1][j]+sum[i,j]} ,i<=k<=j,i<j;
f[i][i]=0
然后就可以用$O(n^3)$的复杂度递推啦。此题结束。
然而n<=1000...
四边形不等式:
若f[i][j]=min{f[i][k]+f[k+1][j]+w[i][j]} ,i<=k<=j;
s[i][j]为使f[i][j]取到最小值的k ,其中有(a<=b<=c<=d)
1.w[b][c]<=w[a][d] (w满足区间包含单调性)
2.w[a][c]+w[b][d]<=w[b][c]+w[a][d] (w满足四边形不等式)
则f也满足四边形不等式(*)
所以s[i][j-1]<=s[i][j]<=s[i+1][j] (**)
*、**:太麻烦了不证了!
于是就可以优化刚才的dp(sum显然满足以上两点),每次的k不是从i枚举到j,而是从s[i][j-1]枚举到s[i+1][j],这样,平摊下来,就可以在O(1)复杂度完成f[i][j]的计算
然而我很沙雕的设f[i][j]表示长度为i,从j开始的区间了..虽然影响不大但是感觉写起来变得有点迷
然后按照我的写法,n=1的时候是要特判的...
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#define LL long long int
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=; LL rd(){
LL x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,num[maxn];
int f[maxn][maxn][],sum[maxn]; int main(){
int i,j,k;
while(~scanf("%d",&N)){
int ans=inf;
for(i=;i<=N;i++) num[i+N]=num[i]=rd();
if(N==){printf("0\n");continue;}
for(i=;i<=*N;i++) sum[i]=sum[i-]+num[i],f[][i][]=i;
for(i=;i<=N;i++){
for(j=;j<*N-i+;j++){
f[i][j][]=inf;
for(k=f[i-][j][];k<=f[i-][j+][];k++){
int a=f[k-j+][j][]+f[i-k+j-][k+][];
if(a<f[i][j][]) f[i][j][]=a,f[i][j][]=k;
}f[i][j][]+=sum[i+j-]-sum[j-];
if(i==N) ans=min(ans,f[i][j][]);
}
}printf("%d\n",ans);
} return ;
}
hdu3506 Monkey Party (区间dp+四边形不等式优化)的更多相关文章
- hdu 3506 Monkey Party 区间dp + 四边形不等式优化
http://acm.hdu.edu.cn/showproblem.php?pid=3506 四边行不等式:http://baike.baidu.com/link?url=lHOFq_58V-Qpz_ ...
- CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】
问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...
- 区间dp+四边形不等式优化
区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...
- P1880 [NOI1995]石子合并[区间dp+四边形不等式优化]
P1880 [NOI1995]石子合并 丢个地址就跑(关于四边形不等式复杂度是n方的证明) 嗯所以这题利用决策的单调性来减少k断点的枚举次数.具体看lyd书.这部分很生疏,但是我还是选择先不管了. # ...
- Codevs 3002 石子归并 3(DP四边形不等式优化)
3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...
- [51nod 1022] 石子归并v2 [dp+四边形不等式优化]
题面: 传送门 思路: 加强版的石子归并,现在朴素的区间dp无法解决问题了 首先我们破环成链,复制一条一样的链并粘贴到原来的链后面,变成一个2n长度的序列,在它上面dp,效率O(8n^3) 显然是过不 ...
- 51nod 1022 石子归并 V2 —— DP四边形不等式优化
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 1022 石子归并 V2 基准时间限制:1 秒 空间限 ...
- HDU 3516 DP 四边形不等式优化 Tree Construction
设d(i, j)为连通第i个点到第j个点的树的最小长度,则有状态转移方程: d(i, j) = min{ d(i, k) + d(k + 1, j) + p[k].y - p[j].y + p[k+1 ...
- HDU-2829 Lawrence (DP+四边形不等式优化)
题目大意:有n个敌方军火库呈直线排列,每个军火库有一个值vi,并且任意相邻的两个库之间都有通道相连.对于任意一条连起来的军火库链,它对我方的威胁可以用函数w(i,j)表示为:w(i,j)=vi*sum ...
随机推荐
- 给 MSYS2 添加中科大的源
最近一段时间不知怎么的,使用默认的 MSYS2 源升级软件或是安装新软件的特别的慢.所以就翻了翻国内的几个开源软件的镜像库,发现中科大的库里就有 MSYS2.所以就研究了一下,给 MSYS2 添加了中 ...
- .NET持续集成与自动化部署之路第二篇——使用NuGet.Server搭建公司内部的Nuget(包)管理器
使用NuGet.Server搭建公司内部的Nuget(包)管理器 前言 Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基 ...
- JAVA消息确认机制之ACK模式
JMS API中约定了Client端可以使用四种ACK模式,在javax.jms.Session接口中: AUTO_ACKNOWLEDGE = 1 自动确认 CLIENT_ACKNOWLEDGE ...
- [译]通往 Java 函数式编程的捷径
原文地址:An easier path to functional programming in Java 原文作者:Venkat Subramaniam 译文出自:掘金翻译计划 以声明式的思想在你的 ...
- 对于ps基本操作的归纳
1.开始新的制作 1)新建 快捷键:Ctrl+n 格式:宽高根据要求自选:颜色模式常用R(红)G(绿)B(蓝) 2)打开电脑上的图片 快捷键:Ctrl+o 2.选框工具 快捷键:M 作用:能 ...
- 结构体内嵌比较函数bool operator < (const node &x) const {}
直接看别人的链接 [http://www.cnblogs.com/ZERO-/p/9347296.html]
- D. Too Easy Problems
链接 [http://codeforces.com/group/1EzrFFyOc0/contest/913/problem/D] 题意 给你n个题目,考试时间T,对于每个问题都有一个ai,以及解决所 ...
- spring boot之mybatis配置
配置在application.yml文件中 mybatis-plus: # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Map ...
- 第三个Sprint ------第十一天
四则运算APP推广: 1通过微信公众平台推广APP,写一片软文,然后推送出去.分享朋友圈.QQ空间. 2通过微博推广APP,@各微博大户. 3让之前内侧的同学转发给自己的小弟小妹或者侄女侄子! 总结: ...
- C++中struct 和 class的区别
首先,C++中类的定义,从狭义上理解,就是我们使用的class类型.从广义上,类就是定义了一个新的类型和新的作用域,它具有成员函数和成员数据. 而对广义类定义的实现分为两种,一种是使用struct实现 ...