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



题意: 给出n个城市的绝对位置,在某些城市上建立m个邮局,使得所有城市和离它最近的邮局的距离之和最小。

思路: 以前做过这种DP,数学知识:中位数距离其他所有数字的距离之和最短。

证明可以看看这儿:HDU-1227

思路和代码几乎一模一样。

代码如下:

/*
 * ID: j.sure.1
 * PROG:
 * LANG: C++
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <iostream>
#define PB push_back
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
/****************************************/
const int N = 305, M = 35;
int n, m;
int w[N];
int dp[M][N], cost[N][N];

void pre_treat()
{
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            cost[i][j] = 0;
            int mid = (i+j)>>1;
            for(int k = i; k <= j;k++) {
                cost[i][j] += abs(w[mid] - w[k]);
            }
        }
    }
}

int solve()
{
    for(int j = 1; j <= n; j++) {
        dp[1][j] = cost[1][j];
    }
    for(int i = 2; i <= m; i++) {
        for(int j = 1; j <= n; j++) {
            int ret = INF;
            for(int k = 1; k < j; k++) {
                ret = min(ret, dp[i-1][k] + cost[k+1][j]);
            }
            dp[i][j] = ret;
        }
    }
    return dp[m][n];
}

int main()
{
#ifdef J_Sure
    freopen("000.in", "r", stdin);
    //freopen("999.out", "w", stdout);
#endif
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &w[i]);
    }
    pre_treat();
    int ans = solve();
    printf("%d\n", ans);
    return 0;
}
时间: 2024-10-17 00:58:20

【DP|数学+预处理】POJ-1160 Post Office的相关文章

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 (动态规划)

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

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

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