演算法: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 度量。居民們希望在城市中選擇建立郵局...