在一条直线上有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