题面在这里

题意

一条路上有\(n\)个村庄,坐标分别为\(x[i]\),你需要在村庄上建设\(m\)个邮局,使得

每个村庄和最近的邮局之间的所有距离总和最小,求这个最小值。

数据范围

\(1\le n\le300,1\le m\le30\)

sol

=山区建小学。

设\(f[i][j]\)表示把\(i\)个邮局建到前\(j\)个村庄时的最小距离总和,转移方程

\[f[i][j]=\min_{k=i-1}^{j}{(f[i-1][k]+d[k+1][j])}
\]

其中\(d[l][r]\)表示在区间\([l,r]\)内修建一个邮局,所能得到的最小距离总和,

可以根据中位数在\(O(n^2)\)的时间内预处理出来,

总复杂度为\(O(n^3)\)

四边形不等式优化

首先需要证明\(d[i][j]\)满足四边形不等式(区间包含关系单调显然),

对于\(i\le i'\le j\le j'\),我们设\(y=mid(i,j'),z=mid(i',j)\),

当\(y\le z\)时(由于对称性,当\(y>z\)时可同法证)有

\[d[i][j]+d[i'][j']\le \sum_{k=i}^{j}{|x[k]-x[y]|}+\sum_{k=i'}^{j'}{|x[k]-x[z]|}
\]

\[=\sum_{k=i}^{j}{|x[k]-x[y]|}+\sum_{k=j+1}^{j'}{|x[k]-x[z]|}+\sum_{k=i'}^{j}{|x[k]-x[z]|}
\]

\[\le \sum_{k=i}^{j}{|x[k]-x[y]|}+\sum_{k=j+1}^{j'}{|x[k]-x[y]|}+\sum_{k=i'}^{j}{|x[k]-x[z]|}
\]

\[=\sum_{k=i}^{j'}{|x[k]-x[y]|}+\sum_{k=i'}^{j}{|x[k]-x[z]|}
\]

\[=d[i][j']+d[i'][j]
\]

证明\(f[i][j]\)满足四边形不等式时,用合并石子类似的方法数学归纳+分类讨论即可

代码

注意一些边界和细节问题

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e8;
const int N=310;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
} il void file(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
} int n,m,x[N],sx[N],s[N][N],d[N][N],f[N][N]; int main()
{
n=read();m=read();
for(RG int i=1;i<=n;i++)x[i]=read(),sx[i]=x[i]+sx[i-1];
for(RG int l=1;l<=n;l++)
for(RG int r=l;r<=n;r++){
RG int mid=(l+r)>>1;
d[l][r]=x[mid]*(mid-l)-(sx[mid-1]-sx[l-1])+(sx[r]-sx[mid])-x[mid]*(r-mid);
} for(RG int i=1;i<=n;i++)s[0][i]=0,s[i][n+1]=n-1; memset(f,63,sizeof(f));
f[0][0]=0;
for(RG int i=1;i<=m;i++)
for(RG int j=n;j>=i;j--)
for(RG int k=s[i-1][j];k<=s[i][j+1];k++)
if(f[i][j]>=f[i-1][k]+d[k+1][j]){
f[i][j]=f[i-1][k]+d[k+1][j];s[i][j]=k;
} printf("%d\n",f[m][n]); return 0;
}

[IOI2000][POJ1160]Post office的更多相关文章

  1. POJ1160 Post Office[序列DP]

    Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18680   Accepted: 10075 Des ...

  2. POJ1160 Post Office (四边形不等式优化DP)

    There is a straight highway with villages alongside the highway. The highway is represented as an in ...

  3. poj1160 post office

    题目大意:有n个乡村,现在要建立m个邮局,邮局只能建在乡村里.现在要使每个乡村到离它最近的邮局距离的总和尽量小,求这个最小距离和. n<300,p<30,乡村的位置不超过10000. 分析 ...

  4. POJ-1160 Post Office (DP+四边形不等式优化)

    题目大意:有v个村庄成直线排列,要建设p个邮局,为了使每一个村庄到离它最近的邮局的距离之和最小,应该怎样分配邮局的建设,输出最小距离和. 题目分析:定义状态dp(i,j)表示建设 i 个邮局最远覆盖到 ...

  5. [POJ1160] Post Office [四边形不等式dp]

    题面: 传送门 思路: dp方程实际上很好想 设$dp\left[i\right]\left[j\right]$表示前$j$个镇子设立$i$个邮局的最小花费 然后状态转移: $dp\left[i\ri ...

  6. DP---基本思想 具体实现 经典题目 POJ1160 POJ1037

    POJ1160, post office.动态规划的经典题目.呃,又是经典题目,DP部分的经典题目怎就这么多.木有办法,事实就这样. 求:在村庄内建邮局,要使村庄到邮局的距离和最小. 设有m个村庄,分 ...

  7. HDU3480 Division——四边形不等式或斜率优化

    题目大意 将N个数分成M部分,使每部分的最大值与最小值平方差的和最小. 思路 首先肯定要将数列排序,每部分一定是取连续的一段,于是就有了方程 $\Large f(i,j)=min(f(i-1,k-1) ...

  8. IOI2000 Post Office (POJ1160)

    前言 昨天XY讲课!讲到这题!还是IOI的题!不过据说00年的时候DP还不流行. 题面 http://poj.org/problem?id=1160 分析  § 1 中位数 首先我们考虑,若有x1 & ...

  9. [poj1160][IOI2000]Post Office【动态规划】

    传送门 https://vjudge.net/problem/POJ-1160#author=SCU2018 题目描述 在一条水平的公路上建有n个小屋,两个小屋间的距离是它们的横坐标之差的绝对值.保证 ...

随机推荐

  1. python mac下安装虚拟环境

    Mac 下 Flask 框架 workon命令找不到 ---- 最终解决方案(详解具体实现操作过程中遇到的坑) Mac 下 Flask 的 全网最详细搭建 1.安装virtualenv和virtual ...

  2. Linux运维常用命令-linux服务器代维常用到的维护命令

    1.删除0字节文件find -type f -size 0 -exec rm -rf {} ; 2.查看进程按内存从大到小排列ps -e   -o "%C   : %p : %z : %a& ...

  3. C语言实例解析精粹学习笔记——39(简单的文本编辑器)

    实例说明: 编辑一个简单的单行文本编辑器,编辑命令有以下几种:(E.Q.R.I.D) 只有自己在完全空白的情况下编写出来的程序,才是真正自己会的程序,现在所做的,不过是程序的搬运工,把书上的程序搬到网 ...

  4. Failed to read candidate component class错误分析

    org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component c ...

  5. POJ 3210 : Coins

    参考:https://blog.csdn.net/u010885899/article/details/46636523 http://kqwd.blog.163.com/blog/static/41 ...

  6. 42-EF Core Migration

    1-常用命令 1-由于2.1版本有点不一样,不会自动创建ApplicationUser类,发现合并没效果.暂时略 增加一个字段 E:\coding\netcore\IdentitySample> ...

  7. java 第五章 方法定义及调用

    1.方法的定义 什么是方法 方法是完成某个功能的一组语句,通常将常用的功能写成一个方法 方法的定义 [访问控制符] [修饰符] 返回值类型 方法名( (参数类型 形式参数, ,参数类型 形式参数, , ...

  8. 关于 poorpool

    poorpool 真名 chenyixiao.是一条傻逼题都不会做的没有脑子的咸鱼. 山西省临汾第一中学 高二 sx省队里最菜的那一个进队靠暴力. 普通的理科生,曾经爱好数学,然而到了高中发现自己所谓 ...

  9. Java检测端口的占用情况

    突然间想到这个问题,在网上搜了一下 http://blog.csdn.net/danieluk/article/details/18518175 网上有很多文章都是用上面那个方法来解决这个问题的,总感 ...

  10. selenium自动化登录qq网页

    一个简单的登录网页上qq的脚本,通过此脚本了解到有些位置是无法通过xpath来定位的反倒是By定位更方便 #encoding=utf-8 from selenium import webdriver ...