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