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 }
原文地址:https://www.cnblogs.com/redlight/p/2448996.html