poj 1160 Post Office(邮局问题)

Post Office

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 17110   Accepted: 9226

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
position. The distance between two positions is the absolute value of the difference of their integer coordinates.

Post offices will be built in some, but not necessarily all of the villages. A village and the post office in it have the same position. For building the post offices, their positions should be chosen so that the total sum of all distances between each village
and its nearest post office is minimum.

You are to write a program which, given the positions of the villages and the number of post offices, computes the least possible sum of all distances between each village and its nearest post office.

Input

Your program is to read from standard input. The first line contains two integers: the first is the number of villages V, 1 <= V <= 300, and the second is the number of post offices P, 1 <= P <= 30, P <= V. The second line contains
V integers in increasing order. These V integers are the positions of the villages. For each position X it holds that 1 <= X <= 10000.

Output

The first line contains one integer S, which is the sum of all distances between each village and its nearest post office.

Sample Input

10 5
1 2 3 6 7 9 11 22 44 50

Sample Output

9

Source

IOI 2000

就是邮局问题。

对于在1~n的村庄中建立m个邮局,要求所有村庄到邮局的距离最小。

多个邮局难解,可以先看一个邮局。在1~n中,建一个邮局,可以建在中间,一定是保证总距离最小的。如果建m个,那么就可以认为:在1~k村庄之间已经建了m-1个,然后在在k~n村庄之间只要建一个就够了。而建这一个邮局的最短距离是可以得到的。由此,我们可以将问题分解为多个子问题。

对于这样的一个问题,可以设一个dp[i][j],表示在1~i的村庄中建立了j个邮局的最短总距离。

所以我们可以得到状态转移方程: dp[i][j]=max(dp[i][j],dp[k] [j-1]+sum[k+1] [ j ])

其中sum[i][j]是从i到j的村庄建立一个邮局的最小距离。可以得到:sum[ i ][ j ]=sum[i][j-1]+x[j]-x[ (i+j )/2 ] ;

那么就可以得到dp 的边界:dp[i][1]=sum[1][i];

#include<stdio.h>
#include<string.h>
int min(int a,int b)
{
	if(a<b)return a;
	else return b;
}
int main()
{
	int V,P,i,j,k,l,x[305],dp[305][305],sum[305][305];
	while(scanf("%d%d",&V,&P)!=EOF)
	{
		memset(sum,0,sizeof(sum));
		for(i=0;i<305;i++)
		for(j=0;j<305;j++)
		dp[i][j]=10000000;
		for(i=1;i<=V;i++)
		{
		scanf("%d",&x[i]);
		sum[i][i]=0;
		}
		for(i=1;i<=V;i++)
		for(j=i+1;j<=V;j++)
		{
		   	sum[i][j]=sum[i][j-1]+x[j]-x[(i+j)/2];
		}
		for(i=1;i<=V;i++)
		dp[i][1]=sum[1][i];

	for(j=1;j<=P;j++)
		{
		for(i=j+1;i<=V;i++)
			{
				for(k=1;k<=i;k++)
				dp[i][j]=min(dp[i][j],dp[k][j-1]+sum[k+1][i]);
			}
		}
		printf("%d\n",dp[V][P]);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 20:06:30

poj 1160 Post Office(邮局问题)的相关文章

POJ 1160 Post Office (动态规划)

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

POJ 1160 Post Office(四边形不等式优化)

四边形不等式 函数w满足 1: 区间包含的单调性,对于\(x1<x2<y1<y2\),有\(w[x2][y1] < w[x1][y2]\) 2: 四边形不等式,对于\(x1<x2<y1<y2\),有\(w[x1][y1]+w[x2][y2] < w[x1][y2]+w[x2][y1]\) 则函数m(其最优选择)也满足四边形不等式. 对于满足四边形不等式的函数,是满足单调性的(x方向单调,y方向也单调),可以通过判断dp是否满足四边形不等式,也可以用来优化转移

POJ 1160 Post Office

N个数到一个数的距离和最小,这个数一定是他们的中位数. dp[i][j]=前i个点,j个office的距离. dp[i][j]=min(dp[k-1][j-1]+w[k][i])    w[k][i]是k..i 修一个office的距离. Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15687   Accepted: 8503 Description There is a straight hi

poj - 1160 - Post Office(dp)

题意:一条直路上有V个村庄(1 <= V <= 300),现在建P个邮局(1 <= P <= 30),求每个村庄到其最近邮局的最短距离和的最小值. 题目链接:http://poj.org/problem?id=1160 -->>状态:dp[i][j]表示前i个村庄建j个邮局的最短距离和. 状态转移方程:dp[i][j] = min(dp[i][j], dp[k][j - 1] + nDis[k + 1][i]);(前k个村庄由前j - 1个邮局管,后面的村庄归最后一个邮

POJ 1160 Post Office(DP+经典预处理)

题目链接:http://poj.org/problem?id=1160 题目大意:在v个村庄中建立p个邮局,求所有村庄到它最近的邮局的距离和,村庄在一条直线上,邮局建在村庄上. 解题思路:设dp[i][j]表示到第i个村庄为止建立j个邮局的最小距离和,dis[i][j]表示i~j之间建一个邮局的最小距离和,我们很容易得出状态转移方程:dp[i][j]=min{dp[k][j]+dis[k+1][i]}(k<i). 主要是dis[i][j]的预处理很巧妙,从别人的博客上看的“将邮局建在i~j中间即

poj 1160 Post Office (区间动态规划)

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

POJ 1160 Post Office (四边形不等式优化DP)

题意: 给出m个村庄及其距离,给出n个邮局,要求怎么建n个邮局使代价最小. 析:一般的状态方程很容易写出,dp[i][j] = min{dp[i-1][k] + w[k+1][j]},表示前 j 个村庄用 k 个邮局距离最小,w可以先预处理出来O(n^2),但是这个方程很明显是O(n^3),但是因为是POJ,应该能暴过去..= =,正解应该是对DP进行优化,很容易看出来,w是满足四边形不等式的,也可以推出来 s 是单调的,可以进行优化. 代码如下: #pragma comment(linker,

poj 1160 Post Office (间隔DP)

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

POJ 1160 Post Office 经典DP + 四边形加速

第一次写四边形不等式的题,现在的理解就是用各种东东缩小了k的范围,从而使复杂度降低到n^2 需要满足的条件是 对于i<i'<j<j' 满足 w(i,j)+w(i',j') <= w(i,j') + w(i'j) #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <map> #include <se