题意:给出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.