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 }

 

 

 

 

 

你可能感兴趣的:(Office)