您的位置:首页 > 其它

poj 1160Post Office

2012-04-15 10:11 369 查看
题意:

给定的一系列的排在整数轴上的村庄位置,然后找出P个村庄建立邮局;

以使每个村庄到他最近的邮局的距离之和最小;

解题思路:

采用动态规划,详见注释

#include<iostream>

using namespace std;

int cost[301][301];//从村落i到村落j由一个邮局控制时的最短距离和
int a[31][301];//a[i][j]记录在前j个村庄中安排i个邮局的最短路径

int vel[301];//记录输入村庄的位置信息

int main()
{
int v,p;
int i,j,k;
cin>>v>>p;
//输入位置信息
for(i=1;i<=v;++i)
cin>>vel[i];
memset(cost,0,sizeof(cost));
memset(a,0,sizeof(a));
//从村落i到村落j由一个邮局控制时的最短距离和
for(i=1;i<=v;++i)
{
for(j=i;j<=v;++j)
{
int mid=(i+j)/2;
for(k=i;k<mid;++k) cost[i][j]+=vel[mid]-vel[k];
for(k=mid+1;k<=j;++k) cost[i][j]+=vel[k]-vel[mid];
//cout<<cost[i][j]<<"   ";
}
//cout<<endl;
}
//计算在前j个村路中建立1个邮局控制的最短距离之和
for(j=1;j<=v;++j)
a[1][j]=cost[1][j];
for(i=2;i<=p;++i)
{
for(j=i;j<=v;++j)
{
int minN=0x7fffffff;
//在前k个村庄设置i-1个邮局加上在k到j之间的村庄设置一个邮局的最小值计为
//在前j个村庄放置i个邮局的最小距离
for(k=i-1;k<j;++k)
{
if(a[i-1][k]+cost[k+1][j] < minN)
minN=a[i-1][k]+cost[k+1][j];
}

a[i][j]=minN;
}
}
cout<<a[p][v]<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: