题目链接
有一排村庄,坐标表示村庄的位置。如(1、4、6、10)表示:在这几个点有村庄。现在要在这一排村庄中建立邮局,使得其它村庄到他们最近邮局的距离总和最小。
其中邮局有V个(V<=300),邮局有P个(P<=30)。问怎么设置邮局位置,求出最小距离。
这个题目有点类似于矩阵连乘问题。要求
在
如果村庄个数为偶数个,那么建在中间两个位置的距离是一样的。比如:
建在
因此:在
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int dp[300+1][300+1],sum[300+1][300+1];
int s[300+1];
int INF = 100000000;
int main()
{
int V,P;
scanf("%d%d",&V,&P);
memset(dp,sizeof(dp),0);
memset(sum,sizeof(sum),0);
memset(s, sizeof(s), 0);
for(int i = 1; i<=V; i++)
scanf("%d",&s[i]);
for(int i = 1; i<V; i++){
for(int j = i+1; j<=V; j++)
sum[i][j] = sum[i][j-1] + s[j] - s[(i+j)/2];
}
for(int i = 1; i<=V; i++)
dp[i][1] = sum[1][i];
for(int j = 2; j<=P; j++){
for(int i = 1; i<=V; i++){
dp[i][j] = INF;
for(int k = 1; k<=i; k++)
dp[i][j] = min(dp[i][j] ,dp[k][j-1]+sum[k+1][i]);
}
}
printf("%d\n",dp[V][P]);
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/neu_chenguangq/article/details/48105869