• 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 }
  • 相关阅读:
    hadoop之 解析HDFS的写文件流程
    Linux之 手动释放内存
    Heka 的编译
    go get 下载需要的相关工具
    峰值计算的方法
    thrift简介
    Bazaar 版本控制工具
    Homebrew
    虚拟机下centos时间不正确的方便解决方法
    golang 应用的部署相关技术
  • 原文地址:https://www.cnblogs.com/redlight/p/2448996.html
Copyright © 2020-2023  润新知