题意:给出N头牛,每头牛有若干个喜欢的点(x,y).求一个方案,使得每头牛都可以在自己喜欢的位置上,且将这N头牛
以1~N的顺序连成一个环(如1-2-3-4-1)所花费的绳子长度最短.
分析:DP,f[i,j]表示将第i头牛绑在它喜欢的第j个位置的最优值.因为要首尾相连,干脆就枚举1号牛绑的位置.
code:
type cow=record
x,y:longint;
end;
const oo=100000000;
var f:array[0..101,0..41] of extended;
c:array[0..101,0..41] of cow;
p:array[0..101] of longint;
n,i,j,k,first:longint;
mind,ans:extended;
function dis(a,b:cow):extended;
begin
dis:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))
end;
function min(a,b:extended):extended;
begin
if a>b then exit(b); exit(a);
end;
begin
readln(n);
for i:=1 to n do
begin
read(p[i]);
for j:=1 to p[i] do read(c[i,j].x,c[i,j].y);
readln;
end;
ans:=oo;
for first:=1 to p[1] do
begin
for i:=1 to p[2] do
f[2,i]:=dis(c[2,i],c[1,first]);
for i:=3 to n do
for j:=1 to p[i] do
begin
mind:=oo;
for k:=1 to p[i-1] do
mind:=min(mind,f[i-1,k]+dis(c[i,j],c[i-1,k]));
f[i,j]:=mind;
end;
for i:=1 to p[n] do
ans:=min(ans,f[n,i]+dis(c[n,i],c[1,first]));
end;
writeln(trunc(ans*100));
end.