[IOI2000][POJ1160]Post office
题面在这里
题意
一条路上有\(n\)个村庄,坐标分别为\(x[i]\),你需要在村庄上建设\(m\)个邮局,使得
每个村庄和最近的邮局之间的所有距离总和最小,求这个最小值。
数据范围
\(1\le n\le300,1\le m\le30\)
sol
=山区建小学。
设\(f[i][j]\)表示把\(i\)个邮局建到前\(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\)时可同法证)有
\]
\]
\]
\]
\]
证明\(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的更多相关文章
- POJ1160 Post Office[序列DP]
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18680 Accepted: 10075 Des ...
- POJ1160 Post Office (四边形不等式优化DP)
There is a straight highway with villages alongside the highway. The highway is represented as an in ...
- poj1160 post office
题目大意:有n个乡村,现在要建立m个邮局,邮局只能建在乡村里.现在要使每个乡村到离它最近的邮局距离的总和尽量小,求这个最小距离和. n<300,p<30,乡村的位置不超过10000. 分析 ...
- POJ-1160 Post Office (DP+四边形不等式优化)
题目大意:有v个村庄成直线排列,要建设p个邮局,为了使每一个村庄到离它最近的邮局的距离之和最小,应该怎样分配邮局的建设,输出最小距离和. 题目分析:定义状态dp(i,j)表示建设 i 个邮局最远覆盖到 ...
- [POJ1160] Post Office [四边形不等式dp]
题面: 传送门 思路: dp方程实际上很好想 设$dp\left[i\right]\left[j\right]$表示前$j$个镇子设立$i$个邮局的最小花费 然后状态转移: $dp\left[i\ri ...
- DP---基本思想 具体实现 经典题目 POJ1160 POJ1037
POJ1160, post office.动态规划的经典题目.呃,又是经典题目,DP部分的经典题目怎就这么多.木有办法,事实就这样. 求:在村庄内建邮局,要使村庄到邮局的距离和最小. 设有m个村庄,分 ...
- HDU3480 Division——四边形不等式或斜率优化
题目大意 将N个数分成M部分,使每部分的最大值与最小值平方差的和最小. 思路 首先肯定要将数列排序,每部分一定是取连续的一段,于是就有了方程 $\Large f(i,j)=min(f(i-1,k-1) ...
- IOI2000 Post Office (POJ1160)
前言 昨天XY讲课!讲到这题!还是IOI的题!不过据说00年的时候DP还不流行. 题面 http://poj.org/problem?id=1160 分析 § 1 中位数 首先我们考虑,若有x1 & ...
- [poj1160][IOI2000]Post Office【动态规划】
传送门 https://vjudge.net/problem/POJ-1160#author=SCU2018 题目描述 在一条水平的公路上建有n个小屋,两个小屋间的距离是它们的横坐标之差的绝对值.保证 ...
随机推荐
- Python练习笔记(2)
文件读写,多线程.多进程 import time,os,threading,random def file_read(path): try: with open(path, 'r') as f: # ...
- OMAPL138制作SD卡启动介质及重装Linux系统
OMAPL138制作SD卡启动盘及重装Linux系统 手里的创龙的OMAPL138平台的系统SSH坏掉了,我重新移植了openssh还是不好使,没有办法了只能重装OMAPL138的系统了,按照创龙给的 ...
- python之打印九九乘法表
配置环境:python 3.6 python编辑器:pycharm 整理成代码如下: #!/usr/bin/env python #-*- coding: utf-8 -*- #九九乘法表 #分析:九 ...
- Python3 logging模块&ConfigParser模块
''' 博客园 Infi_chu ''' ''' logging模块 该模块是关于日志相关操作的模块 ''' import logging # logging.debug('debug') # log ...
- STL 一些常用的STL函数(持续更新
先说一下 一边要用到算法的东西一般要加#include<algorithm>头文件 一.栈和队列 1 栈 :一种线性表 特点 后进先出 头文件 #include<stack&g ...
- (长期更新)OI常用模板
代码很简单的模板就不收录了. DFT 离散傅立叶变换 void dft(pdd *a,int l,bool r){ int i,j=l/2,k; for(i=1;i<l;++i){ if(i&l ...
- 【SAPUI5】ODataを構成するもの
はじめに SAPUI5でアプリケーションを作るにあたり.ODataは避けては通れないトピックです.結構広いテーマなので.5-7回くらいに分けて書きたいと思います.1回目はODataの概要について説明し ...
- Git的使用规范(二)
今天,我们来介绍一下git的一些命令行,来帮我们后面可以面对一些情况的时候,我们可以有一些解决的方法 1.git查看历史记录最全的命令行 git log --pretty=raw 2.对于一下的几个情 ...
- C++11中std::forward的使用
std::forward argument: Returns an rvalue reference to arg if arg is not an lvalue reference; If arg ...
- 创龙DSP6748开发板驱动LCD屏
1. DSP6748内部有2个LCD控制器,Raster Controller 光栅控制器和the LCD Interface Display Driver (LIDD) controller 控制器 ...