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\)轴正方向作边,使这 ...
随机推荐
- python 内置函数总结(大部分)
python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是pytho ...
- STM32F103X datasheet学习笔记---USART
1.前言 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择. 它支持同步 ...
- 017_mac格式化硬盘,mac如何格式化硬盘
想做一个mac和windows都能识别的系统,推荐设置成什么格式 一.在mac下格式化 在Mac 下,打开右下角应用程序-实用工具-磁盘工具,里面选取你的移动硬盘,然后进行格式化,设置成EXFat格式 ...
- linux命令 dirname
功能: 获取给定路径的目录部分 利用man 查看dirname的说明如下: DESCRIPTION Output each NAME with its last non-slash co ...
- saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入
saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入salt的返回值写入mysql数据库:可参考:https://docs.saltstack.com/en/lat ...
- centos6.5系统bash损坏之救援模式修复
1.模拟bash被损坏的情况 # mv /bin/bash /tmp [root@localhost ~]# sync [root@localhost ~]# shutdown -r now 2.挂载 ...
- Java基础95 过滤器 Filter
1.filter 过滤器的概述 filter过滤器:是面向切面编程的一种实现策略,在不影响原来的程序流程的前提下,将一些业务逻辑切入流程中,在请求达到目标之前进行处理,一般用于编码过滤.权限过滤... ...
- Windows系统下oracle数据库每天定时备份
第一步:建立备份脚本oraclebackup.bat 首先建立一个备份bat文件,在D盘下新建备份目录oraclebackup,将oracle安装目录下的EXP.EXE复制到此目录下,再新建一个文本文 ...
- 支持删除的并查集 hdu2473
题解: 代码: #include<bits/stdc++.h> using namespace std; #define ll long long ; int fa[maxn],id,vi ...
- [CodeChef]GERALD07/[JZOJ4739]Ztxz16学图论
题解: 考虑从小到大枚举右端点 对于每个点,令它的权值等于它的编号 那么我们可以用lct维护出一颗最大生成树 维护方法是每次插入一条判断他们在不在一颗树上 若不在直接加,若在就找到链上的最小值 之后看 ...