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