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 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

思路:

sum[i][j]:在第i个村庄和第j个村庄之间建一个邮局的最短距离;

【1,3】邮局建在第2个村庄;

【1,4】邮局建在2、3距离一样;

【1,5】sum[1][5]=sum[1][4]+村庄5到3的距离;

即:sum[i][j]=sum[i][j-1]+x[j]-x[(i+j)/2];

dp[i][j]:在前i个村庄中建立j个邮局的最小距离;

dp[i][j]=min(dp[i][j],dp[k][j-1]+sum[k+1][i]) ;即在[1,K]村庄建立j-1个邮局,在[k+1,i]村庄建立一个邮局

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 305
const int inf=0x3fffffff;
int dp[N][35]; //在前i个村庄中建立j个邮局的最小耗费
int sum[N][N];//sum[i][j]:第i个村庄到第j个村庄建一个邮局的最短距离
int x[N]; //村庄位置
int main()
{
    int v,p,i,j,k;
    while(scanf("%d%d",&v,&p)!=-1)
    {
        for(i=1;i<=v;i++)
            scanf("%d",&x[i]);
        memset(sum,0,sizeof(sum));
        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][i]=0; //一个村庄一个邮局距离为零
            dp[i][1]=sum[1][i]; 前i个村庄建立一个邮局
        }
        for(j=2;j<=p;j++)
        {
            for(i=j+1;i<=v;i++)
            {
                dp[i][j]=inf;
                for(k=j-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-07-28 15:46:12

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

[ACM] POJ 1141 Brackets Sequence (区间动态规划)

Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25087   Accepted: 7069   Special Judge Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular sequence. 2. If S is a re

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 (四边形不等式优化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(邮局问题)

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 villa

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