【poj1160】 Post Office

http://poj.org/problem?id=1160 (题目链接)

题意

  按照递增顺序给出一条直线上坐标互不相同的n个村庄,要求从中选择p个村庄建立邮局,每个村庄使用离它最近的那个邮局,使得所有村庄到各自所使用的邮局的距离总和最小。

Solution

  经典dp方程:

  其中f[i][j]表示前j个村庄,放置i个邮局的最优方案。w[i][j]表示在i到j的村庄放置一个邮局,i~j的村庄到这个邮局的总距离。考虑如何求解w[i][j],因为只放置一个邮局,所以一定是放在最中间的那个点上,所以邮局两侧的点到邮局的的距离之和就为它们两点之间的距离,然后从两边向中间扫描一遍更新答案就可以了。于是我们就得到了O(n*n*n*p)的做法。

  考虑四边形不等式优化。像dp方程长成形如“合并石子”那个样子的,很多都可以用四边形不等式优化。然而通过四边形不等式证明决策单调性实在是繁琐爆炸,看了一晚上感觉就是不停的放缩不等式强行证明。。其实当你感觉可以四边形不等式优化的时候,最有效的做法就是写个普通dp再写个优化后的dp进行对拍(→_→反正dp短)。

  于是经过四边形不等式优化后它的决策就神奇的具有单调性了→_→。设s[i][j]表示f[i][j]的决策方案。那么s[i-1][j]<=s[i][j]<=s[i][j+1]。所以我们枚举k的时候就不用从头枚到尾了,直接从s[i-1][j]枚到s[i][j+1]就可以了,所以复杂度就变成了O(n*n*p)。也许还有论文所说的O(n*p)的做法,就是把w[i][j]O(n)预处理,然而这如何O(n)预处理呢,我只会n²。。。

代码

// poj1160
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define MOD 998244353
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
	int f,x=0;char ch=getchar();
	while (ch<=‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1;else f=1;ch=getchar();}
	while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘;ch=getchar();}
	return x*f;
}

const int maxn=500;
int f[maxn][maxn],sum[maxn][maxn],s[maxn][maxn],a[maxn];
int n,p;

int dis(int i,int j) {
	if (i>=j) return 0;
	if (sum[i][j]!=0) return sum[i][j];
	int x=i,y=j;
	while (x<y) sum[i][j]+=a[y--]-a[x++];
	return sum[i][j];
}
int main() {
	while (scanf("%d%d",&n,&p)!=EOF) {
		for (int i=1;i<=n;i++) scanf("%d",&a[i]);
		memset(f,0,sizeof(f));
		memset(sum,0,sizeof(sum));
		for (int i=1;i<=n;i++) f[1][i]=dis(1,i),s[i][i]=i-1;
		for (int i=2;i<=p;i++) {
			s[i][n+1]=n-1;
			for (int j=n;j>=i;j--) {
				f[i][j]=inf;
				for (int k=s[i-1][j];k<=s[i][j+1];k++)
					if (f[i-1][k]+dis(k+1,j)<f[i][j])
						f[i][j]=f[i-1][k]+dis(k+1,j),s[i][j]=k;
			}
		}
		printf("%d\n",f[p][n]);
	}
	return 0;
}

  

时间: 2024-11-05 03:04:13

【poj1160】 Post Office的相关文章

题解【POJ1160】Post Office

[POJ1160]Post Office Description There is a straight highway with villages alongside the highway. The highway is represented as an integer axis, and the position of each village is identified with a single integer coordinate. There are no two village

【原创】利用Office宏实现powershell payload远控

本文将演示使用Veil-Evasion生成远控所需要的payload以及监听器,然后使用MacroShop生成payload 相关的VBA代码,最后演示将VBA代码写入.doc文本文档的宏中. 环境:虚拟机_Kali          依赖:Veil-Evasion.MacroShop 0x00 安装Veil-Evasion.MacroShop (老鸟可绕过) 本例采用git 安装. 打开Veil-Evasion的github页面:https://github.com/Veil-Framewor

【CodeForces】 830A Office Keys

传送门 codeforces luogu 题目描述 There are n people and k keys on a straight line. Every person wants to get to the office which is located on the line as well. To do that, he needs to reach some point with a key, take the key and then go to the office. Onc

【JavaWeb】在office word中使用merge field出现空行问题

1.问题介绍 项目目前是使用JAVA加office来生成文档.主要问题在于,因为是英文文档,如果文档格式是: <地址一> <地址二> <地址三> 而地址二有时为空有时不为空,为空的时候这一行就会出现空行,用户不能接受,所以需要方法处理. 2.解决办法 使用office自带的if else功能,将<地址一>和<地址二>放在同一行.当其不为空时,将换行符插入.如下所示: <地址一>{ IF <地址二>=""

【POJ】【1739】Post Office

DP/四边形不等式 邮局,经典的四边形不等式例题! 关于四边形不等式的学习请看 赵爽论文<动态规划加速原理之四边形不等式> 题目总结&题解:http://blog.csdn.net/shiwei408/article/details/8791011 1 Source Code 2 Problem: 1160 User: sdfzyhy 3 Memory: 1108K Time: 0MS 4 Language: G++ Result: Accepted 5 6 Source Code 7

【四边形不等式】POJ1160[IOI2000]-Post Office

[题目大意] v个村庄p个邮局,邮局在村庄里,给出村庄的位置,求每个村庄到最近邮局距离之和的最小值. [思路] 四边形不等式,虽然我并不会证明:( dp[i][j]表示前i个村庄建j个邮局的最小值,w[i][j]表示在i到j之间建立一个邮局的最小值.w[i][j]显然取i~j的中位数,可以在O(1)时间内求出. 显然dp[i][j]=min{dp[k][j-1]+w[k+1][i]}. 傻傻写错i和j…… 1 #include<iostream> 2 #include<cstdio>

【转】【教程】office 2013 &amp; visio 2013的激活

原文网址:http://zhan.renren.com/sola86?gid=3602888498037097351&checked=true 1.下载安装文件 office和visio都有两种版本,批量授权版(vol)和零售版(mlf),前者一个密钥可以激活多台电脑,后者一个密钥只能激活1台电脑.而且,前者的密钥比较容易找到.所以,推荐安装批量授权版. [零售版]SW_DVD5_Office_Professional_Plus_2013_64Bit_ChnSimp_MLF_X18-55285.

HDU 5933 ArcSoft&#39;s Office Rearrangement 【模拟】(2016年中国大学生程序设计竞赛(杭州))

ArcSoft's Office Rearrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3    Accepted Submission(s): 2 Problem Description ArcSoft, Inc. is a leading global professional computer photogra

【原创】你知道OneNote的OCR功能吗?office lens为其增大威力,中文也识别

OneNote提供了强大的从图片中取出文字的功能,大家只要装上了桌面版OneNote(本人用的2013版和win8.1版测试的,其他版本为测),将图片放在OneNote笔记中,右键图片即可把图片中的文字复制到粘贴板. 默认粘贴后,发现英文复制出来了,但中文是乱码.别急,您需要设置一下,在右键菜单的下方有一个选项:"使图像中的文本可以搜索" - 中文. 然后,再选择"复制图像中的文本",会发现完美的粘贴出来了. 使用wp手机的用户,可以在应用市场搜索"off