[作业]青蛙的烦恼

青蛙的烦恼 (frog.pas/c/cpp) 
池塘中有n 片荷叶恰好围成了一个凸多边形,有一只小青蛙恰好站在1 号荷叶上,小青
蛙想通过最短的路程遍历所有的荷叶(经过一个荷叶一次且仅一次),小青蛙可以从一片荷
叶上跳到另外任意一片荷叶上。 
 
输入数据(frog.in) (frog.in)      
      第一行为整数n,荷叶的数量。 
接下来n 行,每行两个实数,为 n 个多边形的顶点坐标,按照顺时针方向给出。保证不
会爆double。 
输出数据(frog.out) (frog.out): :: :     
遍历所有荷叶最短路程,请保留3 位小数,无 Checker。 
样例输入和输出     

50.0 1.0 
5.0 1.0 
0.0 0.0 
45.0 0.0 
50.211 
数据范围::: :     
对于所有数据,0<n<=720 

友情提示:本题有大量数据做了防骗处理。
-------------------------------------------------------------------------------------------------------------------
题目描述不是很清晰,数据也有一个点有误。这就是个简单的Dp问题。。
-------------------------------------------------------------------------------------------------------------------
代码:

var
   f:array[1..720,1..720,0..1] of double;
   d:array[1..1500,1..1500] of double;
   x,y:array[1..1500] of double;
   ans:double;
   n,i,j,l:longint;
function min(a,b:double):double;
begin
     if a<b then exit(a) else exit(b);
end;
begin
     assign(input,'frog.in');
     assign(output,'frog.out');
     reset(input);
     rewrite(output);
     readln(n);
     for i:=1 to n do begin
         readln(x[i],y[i]);
         x[i+n]:=x[i];
         y[i+n]:=y[i];
         f[i,1,0]:=0;
         f[i,1,1]:=0;
     end;
     for i:=1 to 2*n do
     for j:=1 to 2*n do
         d[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
     for l:=2 to n do
     for i:=1 to n do begin
         f[i,l,0]:=min(d[i,i+1]+f[i+1,l-1,0],d[i,i+l-1]+f[i+1,l-1,1]);
         f[i,l,1]:=min(d[i+l-1,i+l-2]+f[i,l-1,1],d[i+l-1,i]+f[i,l-1,0]);
     end;
     ans:=min(f[1,n,0],f[1,n,1]);
     write(ans:0:3);
     close(input);
     close(output);
end.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值