郵局問題(Vijos1242)

2021-05-28 15:14:53 字數 1208 閱讀 6872

演算法:dp

分析:ioi2000的一道經典的dp題目,設dis[i,j]表示從i到j的所有點到i—j中點的距離和(其實這裡也可以採用別的方式)。然後設f[i,j]為前i個村莊設了j個郵局後的距離的最小值,那麼f[i,j]=min(f[i,j],f[k,j-1]+dis[k+1,i])。

program vijos1242;

const

maxn=300;

maxm=30;

var n,m:longint;

a:array [0..maxn] of longint;

dis:array [0..maxn,0..maxn] of longint;

f:array [0..maxn,0..maxm] of longint;

procedure init;

var i:longint;

begin

readln(n,m);

for i:=1 to n do read(a[i]);

end;

procedure ycl;

var i,j,k:longint;

begin

for i:=1 to n do

begin

for j:=1 to n do

begin

for k:=i to j do

inc(dis[i,j],abs(a[k]-a[(i+j) shr 1]));

end;

end;

end;

function min(x,y:longint):longint;

begin

if x=j then

begin

for k:=1 to i-1 do

f[i,j]:=min(f[i,j],f[k,j-1]+dis[k+1,i]);

end;

end;

end;

end;

begin

assign(input,'vj1242.in'); reset(input);

assign(output,'vj1242.out'); rewrite(output);

init;

ycl;

main;

writeln(f[n,m]);

close(input); close(output);

end.

郵局選址問題

在乙個按照東西和南北方向劃分成規整街區的城市裡,n個居民點散亂地分布在不同的街區中。用 x 座標表示東西向,用 y座標表示南北向。各居民點的位置可以由座標 x,y 表示。街區中任意2 點 x1,y1 和 x2,y2 之間的距離可以用數值 x1 x2 y1 y2 度量。居民們希望在城市中選擇建立郵局的...

郵局問題 DP

問題描述 一些村莊建在一條筆直的高速公路邊上,我們用一條座標軸來描述這條公路,每個村莊的座標都是整數,沒有兩個村莊的座標相同。兩個村莊的距離定義為座標之差的絕對值。我們需要在某些村莊建立郵局。使每個村莊使用與它距離最近的郵局,建立郵局的原則是 所有村莊到各自使用的郵局的距離總和最小。輸入格式 第一行...

郵局選址問題

描述 在乙個按照東西和南北方向劃分成規整街區的城市裡,n個居民點散亂地分布在不同的街區中。用x 座標表示東西向,用y座標表示南北向。各居民點的位置可以由座標 x,y 表示。街區中任意2 點 x1,y1 和 x2,y2 之間的距離可以用數值 x1 x2 y1 y2 度量。居民們希望在城市中選擇建立郵局...