IOI2000 Post Office (POJ1160)

前言

昨天XY讲课!讲到这题!还是IOI的题!不过据说00年的时候DP还不流行。

题面

http://poj.org/problem?id=1160

分析

 § 1 中位数

首先我们考虑,若有x1 < x2 < ... < xn,则当∑abs(x - xi)最小时,x为x, x, ... , xn这n个数的中位数。

证明如下:我们把x, x, ... , xn看作数轴上n个点,我们先考虑两端,要使abs(x - x1) + abs(x - xn)最小,那么x必定在x1和xn中间,这是个很显然的初中数学题。

好,那么我们就可以置这两个点不管了;剩下的点我们也这样考虑,如此类推,最后要么剩下一个点,要么就是剩下两个点中间的一段区间,答案就显而易见了。证毕。

(在July 1, 2018的AtCoder Contest 100 Task C Linear Approximation就是用这个思路,但是不知道为什么到比赛结束我还是WA,到时候也搞个这题的题解)

§ 2 给定一段村庄怎么放邮局

我们要求每个村庄到邮局距离总和最近,那么给定一段区间里的村庄,我们要找到一个满足要求的村庄建邮局,由上面关于中位数的结论可知,建邮局的村庄就是这段村庄最中间的那个。

§ 3 动态规划

既然我们知道,在一段给定的村庄下放邮局的最小花费,那么很容易想到一个区间DP的思路。

设DP[i][j]表示在编号为1~i的村庄中,建了j个邮局,所需的最小花费。

这时转移方程已经非常明显了:

DP[i][j] = min{ DP[k][j - 1] + cost[k + 1][i] }

其中j - 1 <= k <= i,cost[l][r]表示在l到r的区间里建一个邮局所需花费。

而cost是可以在O(n2)的时间内预处理出来的,那么时限是绝对绰绰有余了。

参考代码

 1 // POJ1160
 2 // IOI2000
 3 // Post Office
 4 #include <cstdio>
 5 #include <algorithm>
 6 const int MAXV = 305, MAXP = 35, INF = 0x3f3f3f3f;
 7
 8 int V, P, X[MAXV], DP[MAXV][MAXP], sum[MAXV][MAXV];
 9
10 int main() {
11     scanf("%d%d", &V, &P);
12     int i, j, k, lim;
13     for (i = 1; i <= V; i++) scanf("%d", &X[i]);
14     for (i = 1; i < V; i++)
15         for (j = i + 1; j <= V; j++) sum[i][j] = sum[i][j - 1] + X[j] - X[i + j >> 1];  // 预处理cost,这里用sum写了
16 //    DP[0][0] = INF;  // 这里注意DP[0][0]=0,但是DP[i][0]=INF,当i > 0时,因为这时候这个状态是没有意义的
17     for (i = 1; i <= V; i++) {
18         DP[i][0] = INF;
19         lim = std::min(i, P);
20         for (j = 1; j <= lim; j++) {
21             DP[i][j] = INF;
22             for (k = j - 1; k < i; k++) DP[i][j] = std::min(DP[i][j], DP[k][j - 1] + sum[k + 1][i]);
23         }
24     }
25     printf("%d\n", DP[V][P]);
26     return 0;
27 }

总结

如果放在现在,这大概就够个联赛题难度了。但是当年呢DP在算法竞赛中还不常用,所以当年要想到这个思路,是非常不容易了。

讲题是zzd大佬还讲了一个很奇怪的方程:

DP[i][j]表示前i个村庄,建了j个邮局,其中第i个村庄一定是邮局的最小花费。

当然这个状态转移也不难写,但是要注意答案不是DP[V][P],而是DP[V + 1][P + 1]。(即加一个假村庄,假村庄上建一个假邮局,这样就会把前面n个村庄的花费也正常纳入了,当然要通过一些手段不计算假村庄的花费)

原文地址:https://www.cnblogs.com/CaptainSlow/p/9262312.html

时间: 2024-08-27 10:53:46

IOI2000 Post Office (POJ1160)的相关文章

【四边形不等式】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>

Post Office

Post Office poj-1160 题目大意:给你在数轴上的n个村庄,建立m个邮局,使得每一个村庄距离它最近的邮局的距离和最小,求距离最小和. 注释:n<=300,m<=min(n,30) 想法:一道DP题,超级有趣.变强中的我查了题解.是这样的:我们定义两个数组,分别是dp和sum. dp[i][j]表示从第一个村庄到第i个村庄建立j个邮局的最小和. sum[i][j]表示从第i个村庄到第j个村庄建立一个邮局的最小代价. 然后,我们发现sum数组是可以预处理出来的.对于sum[i][j

poj1160 Post Office 四边形不等式

在一条直线上有n个村庄,选出m个村庄,在其中每个村庄建立一个邮局,要求每个村庄到最近邮局的距离和最小. f[i][j]:在前i个村庄中建立j个邮局的最小耗费 dis[i][j]:在第i个村庄到第j个村庄中建立1个邮局的最小耗费 那么就有转移方程:f[i][j] = min(f[i][j],f[k][j-1]+dis[k+1][i]) DP的边界状态即为f[i][1] = dis[1][i]; 所要求的结果即为f[n][m]; 然后就说说求dis数组的优化问题,可以假定有6个村庄,村庄的坐标已知分

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 villag

题解【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

【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],因为只放置一个邮局,所以一定是放在最中间的那个点上,所以邮局

POJ1160 Post Office[序列DP]

Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18680   Accepted: 10075 Description There is a straight highway with villages alongside the highway. The highway is represented as an integer axis, and the position of each vill

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 villages in the same positio

【DP|数学+预处理】POJ-1160 Post Office

Post Office Time Limit: 1000MS Memory Limit: 10000K 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 coord