POJ.1160.Post Office(DP 四边形不等式)
\(Description\)
一条直线上有n个村庄,位置各不相同。选择p个村庄建邮局,求每个村庄到最近邮局的距离之和的最小值。
\(Solution\)
先考虑在\([l,r]\)建一个邮局,最优解肯定是建在中间。
这样\(mid\)两边对称,距离和是最小的;若建在\(mid-1\),(假设\(mid\)与\(mid-1\)相距\(1\))虽然左边\(mid-1\)个村庄\(dis\)都\(-1\)了,但是右边有\(mid\)个村庄的\(dis\)会\(+1\)。
如果区间长度为偶数,建在中间两个位置任意一个都是最优的。
设\(f[i][j]\)表示在前\(i\)个村庄建了\(j\)个邮局的最小值,那么 \(f[i][j] = \min\{ f[k][j-1]+dis(k+1,i) \}\)。
\(dis(k+1,i)\)表示只考虑在\([k+1,i]\)建一个邮局的最小值。
预处理\(dis\)时 如果已知\(dis[i][j-1]\),那么无论\(j-1\)是奇是偶,\(dis[i][j]\)都等于\(dis[i][j-1]+ j到i~j中点的距离\)(也可以算出来吧)
另外满足决策单调性\(P[i][j-1]\leq P[i][j]\leq P[i+1][j]\),能用四边形不等式优化到\(O(np)\)
于是从0ms优化到了16ms??同样0ms了
[Update]:这题好像还可以带权二分。。
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=305;
int n,m,A[N],f[N][35],dis[N][N],P[N][N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void DP1()//O(n^2m)
{
for(int i=1; i<=n; ++i)
for(int j=2; j<=m; ++j)//from 2
for(int k=j-1; k<i; ++k)
f[i][j]=std::min(f[i][j],f[k][j-1]+dis[k+1][i]);
}
void DP2()//O(nm)
{
for(int tmp,j=2; j<=m; ++j)//先枚举j吧 (不知道为什么先i不对==)
{
P[n+1][j]=n-1;//上边界!
for(int i=n; i>=j; --i)
for(int k=P[i][j-1]; k<=P[i+1][j]; ++k)
if(f[i][j]>(tmp=f[k][j-1]+dis[k+1][i]))
f[i][j]=tmp, P[i][j]=k;
}
}
int main()
{
n=read(),m=read();
for(int i=1; i<=n; ++i) A[i]=read();
for(int i=1; i<n; ++i)
for(int j=i+1; j<=n; ++j)
dis[i][j]=dis[i][j-1]+A[j]-A[i+j>>1];
memset(f,0x3f,sizeof f);
for(int i=1; i<=n; ++i) f[i][1]=dis[1][i] ,P[i][i]=i;//预处理!
DP2();
printf("%d",f[n][m]);
return 0;
}
POJ.1160.Post Office(DP 四边形不等式)的更多相关文章
- POJ 1160 经典区间dp/四边形优化
链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...
- CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】
问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...
- Codevs 3002 石子归并 3(DP四边形不等式优化)
3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...
- POJ 1160 Post Office (四边形不等式优化DP)
题意: 给出m个村庄及其距离,给出n个邮局,要求怎么建n个邮局使代价最小. 析:一般的状态方程很容易写出,dp[i][j] = min{dp[i-1][k] + w[k+1][j]},表示前 j 个村 ...
- POJ 1160 Post Office(区间DP)
Description There is a straight highway with villages alongside the highway. The highway is represen ...
- POJ-1160 Post Office (DP+四边形不等式优化)
题目大意:有v个村庄成直线排列,要建设p个邮局,为了使每一个村庄到离它最近的邮局的距离之和最小,应该怎样分配邮局的建设,输出最小距离和. 题目分析:定义状态dp(i,j)表示建设 i 个邮局最远覆盖到 ...
- hdu 3506 Monkey Party 区间dp + 四边形不等式优化
http://acm.hdu.edu.cn/showproblem.php?pid=3506 四边行不等式:http://baike.baidu.com/link?url=lHOFq_58V-Qpz_ ...
- hdu3506 Monkey Party (区间dp+四边形不等式优化)
题意:给n堆石子,每次合并相邻两堆,花费是这两堆的石子个数之和(1和n相邻),求全部合并,最小总花费 若不要求相邻,可以贪心地合并最小的两堆.然而要求相邻就有反例 为了方便,我们可以把n个数再复制一遍 ...
- HDU.3516.Tree Construction(DP 四边形不等式)
题目链接 贴个教程: 四边形不等式学习笔记 \(Description\) 给出平面上的\(n\)个点,满足\(X_i\)严格单增,\(Y_i\)严格单减.以\(x\)轴和\(y\)轴正方向作边,使这 ...
随机推荐
- jmeter中实现java请求实战日志
view code public class JdbcInsert implements JavaSamplerClient { // 全局变量 PreparedStatement pstmt; Co ...
- 【转】Python之列表生成式、生成器、可迭代对象与迭代器
[转]Python之列表生成式.生成器.可迭代对象与迭代器 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterabl ...
- [转]SPI通信原理简介
[转自]http://www.cnblogs.com/deng-tao/p/6004280.html 1.前言 SPI是串行外设接口(Serial Peripheral Interface)的缩写.是 ...
- 【转】深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
这篇博文,我们使用ActiveMQ为大家实现一种点对点的消息模型.如果你对点对点模型的认识较浅,可以看一下第一篇博文的介绍. JMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单,下 ...
- cocos2d-x在App中的应用
cocos2d-x是一个应用广泛的开源游戏引擎,主要是应用与开发2D游戏,开源运行于多个平台,如果只是针对于移动端平台而言,可以运行于android和ios平台. cocos2d-x目前的版本是3.1 ...
- C#面向对象(基础知识)
面向对象:就是CLASS,class就是用户自定义类型: class:用户自定义引用类型:三大特点:封装.继承.多态: 解决方案中右键添加class:class内可以写结构体,枚举,函数: C#中各个 ...
- 100以内的质数(for和if)
- 大型NodeJS项目架构与优化
使用场景: proxy(API冗余,跨域) vue ssr(服务端渲染) socket(大并发,通讯) 区块链(创业公司,新兴行业) 讨论什么? NodeJS异步IO原理及优化方案 NodeJS内存管 ...
- ExtJs常用布局--layout详解(含实例)
序言: 笔者用的ExtJs版本:ext-3.2.0 ExtJs常见的布局方式有:border.form.absolute.column.accordion.table.fit.card.anchor ...
- notepad++ 快捷键大全、notepad常用快捷键
Notepad++ 快捷键 大全, notepad++也情有独钟,最近发现了一个快捷键,就是选中单词,ctrl+shift+enter.不过现在想知道一个快捷键,假设有三行代码,选中后一般按TAB就可 ...