POJ1160

题意:给出n个村庄的坐标,要求建m个邮局,使得所有村庄到离其最近的邮局的距离之和最小.
分析:DP.f[i,j]表示前i个村庄建j个邮局的最小代价.
f[i,j]=min{f[k,j-1]+cost[k+1,i]}

cost[l,r]表示在l,r之间建一个邮局,代价是多少.可以O(N^3)地预处理出来.总复杂度为O(N^3).

code:

const oo=100000000;
var   f,dis:array[0..310,0..310] of longint;
      p:array[0..310] of longint;
      n,m,i,j,k,now,mid:longint;

      function min(a,b:longint):longint;
      begin
            if a<b then exit(a); exit(b);
      end;

begin
      readln(n,m);
      for i:=1 to n do read(p[i]);

      for i:=1 to n do
         for j:=i+1 to n do
         begin
               mid:=(i+j)>>1;
               for k:=i to j do
               dis[i,j]:=dis[i,j]+abs(p[k]-p[mid]);
         end;

      for i:=1 to n do
      f[i,1]:=dis[1,i];

      for i:=1 to n do
         for j:=2 to min(i,m) do
         begin
               now:=oo;
               for k:=j-1 to i-1 do
                  now:=min(now,f[k,j-1]+dis[k+1,i]);
               f[i,j]:=now;
         end;
      writeln(f[n,m]);
end.

转载于:https://www.cnblogs.com/exponent/archive/2011/08/10/2133577.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值