在一条直线上有n个村庄,选出m个村庄,在其中每个村庄建立一个邮局,要求每个村庄到最近邮局的距离和最小。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define N 1000 #define INF 100000000 using namespace std; int n,m,i,j,k,p[N],dis[N][N],f[N][N],s[N][N]; void Init() //初始化 { for (i=1; i<=n; i++) for (j=1; j<=n; j++) f[i][j]=INF; for (i=1; i<=n; i++) f[i][1]=dis[1][i]; for (i=1; i<=m; i++) s[n + 1][i]=n; } int main() { scanf("%d%d",&n,&m); for (i=1; i<=n; i++) scanf("%d",&p[i]); for (i=1; i<=n; i++) for (j=i+1; j<=n; j++) dis[i][j]=dis[i][j - 1] + p[j] - p[(i + j) >> 1]; Init(); for (j=2; j<=m; j++) for (i=n; i>j; i--) for (k=s[i][j - 1]; k<=s[i + 1][j]; k++) { int t=f[k][j - 1] + dis[k + 1][i]; if (f[i][j] > t) { f[i][j]=t; s[i][j]=k; } } printf("%d",f[n][m]); return 0; }
poj1160 Post Office 四边形不等式,布布扣,bubuko.com
原文地址:http://blog.csdn.net/dream_epic/article/details/26394681