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中间即(i+j)/2的位置,如果i+j不能被整除建在左边和右边结果一样”。于是dis[i][j]=dis[i][j-1]+pos[j]-pos[(i+j)/2]。

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const int N=1e3+5;
 6
 7 int dp[N][50],pos[N],dis[N][N];//dis[i][j]表示在i~j之间建一个邮局的最小距离和
 8
 9 int main(){
10     int n,m;
11     while(~scanf("%d%d",&n,&m)){
12         memset(dp,0x3f,sizeof(dp));
13         for(int i=1;i<=n;i++){
14             scanf("%d",&pos[i]);
15         }
16         //预处理dis[i][j]
17         for(int i=1;i<=n;i++){
18             dis[i][i]=0;
19             for(int j=i+1;j<=n;j++){
20                 dis[i][j]=dis[i][j-1]+pos[j]-pos[(i+j)/2];
21             }
22             dp[i][1]=dis[1][i];
23         }
24
25         for(int j=2;j<=m;j++){
26             for(int i=j;i<=n;i++){
27                 for(int k=j-1;k<i;k++){
28                     dp[i][j]=min(dp[k][j-1]+dis[k+1][i],dp[i][j]);
29                 }
30             }
31         }
32         printf("%d\n",dp[n][m]);
33     }
34     return 0;
35 }
时间: 2024-08-03 07:39:59

POJ 1160 Post Office(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(四边形不等式优化)

四边形不等式 函数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)

题意:一条直路上有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 + 四边形加速

第一次写四边形不等式的题,现在的理解就是用各种东东缩小了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 (四边形不等式优化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 (区间动态规划)

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