I and OI
Past...

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


 

posted on 2011-08-12 16:11  exponent  阅读(255)  评论(0)    收藏  举报