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 <set>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <climits>

using namespace std;

typedef long long LL;
const int maxn = 305;
const int maxm = 55;
int f[maxn][maxm], pos[maxn], n, m, cost[maxn][maxn];
int s[maxn][maxm];

int main() {
    while(scanf("%d%d", &n, &m) != EOF) {
        for(int i = 1;i <= n;i++) {
            scanf("%d", &pos[i]);
        }

        memset(cost,0,sizeof(cost));
        for(int i = 1;i <= n;i++) {
            for(int j = i;j <= n;j++) {
                for(int k = i;k <= j;k++) {
                    cost[i][j] += abs(pos[k] - pos[(i + j) / 2]);
                }
            }
        }

        memset(f,0x3f,sizeof(f));
        int ans = INT_MAX;
        for(int i = 1;i <= n;i++) {
            f[i][1] = cost[1][i];
            s[i][1] = 1;
        }

        for(int i = 2;i <= n;i++) {
            int sj = min(i, m);
            s[i][sj + 1] = i - 1;
            for(int j = sj; j >= 2; j--) {
                for(int k = s[i - 1][j]; k <= s[i][j + 1]; k++) {
                    if(f[k][j - 1] + cost[k + 1][i] < f[i][j]) {
                        s[i][j] = k;
                        f[i][j] = f[k][j - 1] + cost[k + 1][i];
                    }
                }
            }
        }
        printf("%d\n", f[n][m]);
    }
    return 0;
}

  

时间: 2025-01-01 10:08:39

POJ 1160 Post Office 经典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)

题意:一条直路上有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(四边形不等式优化)

四边形不等式 函数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 (动态规划)

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

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