poj 1160Post Office
题意:
给定的一系列的排在整数轴上的村庄位置,然后找出P个村庄建立邮局;
以使每个村庄到他最近的邮局的距离之和最小;
解题思路:
采用动态规划,详见注释
1 #include<iostream> 2 3 using namespace std; 4 5 int cost[301][301];//从村落i到村落j由一个邮局控制时的最短距离和 6 int a[31][301];//a[i][j]记录在前j个村庄中安排i个邮局的最短路径 7 8 int vel[301];//记录输入村庄的位置信息 9 10 int main() 11 { 12 int v,p; 13 int i,j,k; 14 cin>>v>>p; 15 //输入位置信息 16 for(i=1;i<=v;++i) 17 cin>>vel[i]; 18 memset(cost,0,sizeof(cost)); 19 memset(a,0,sizeof(a)); 20 //从村落i到村落j由一个邮局控制时的最短距离和 21 for(i=1;i<=v;++i) 22 { 23 for(j=i;j<=v;++j) 24 { 25 int mid=(i+j)/2; 26 for(k=i;k<mid;++k) cost[i][j]+=vel[mid]-vel[k]; 27 for(k=mid+1;k<=j;++k) cost[i][j]+=vel[k]-vel[mid]; 28 //cout<<cost[i][j]<<" "; 29 } 30 //cout<<endl; 31 } 32 //计算在前j个村路中建立1个邮局控制的最短距离之和 33 for(j=1;j<=v;++j) 34 a[1][j]=cost[1][j]; 35 for(i=2;i<=p;++i) 36 { 37 for(j=i;j<=v;++j) 38 { 39 int minN=0x7fffffff; 40 //在前k个村庄设置i-1个邮局加上在k到j之间的村庄设置一个邮局的最小值计为 41 //在前j个村庄放置i个邮局的最小距离 42 for(k=i-1;k<j;++k) 43 { 44 if(a[i-1][k]+cost[k+1][j] < minN) 45 minN=a[i-1][k]+cost[k+1][j]; 46 } 47 48 a[i][j]=minN; 49 } 50 } 51 cout<<a[p][v]<<endl; 52 return 0; 53 }