Program Pro_3_1; {例3的动态规划解法} Const Inputfile ='input.Txt'; {输入文件名} Outputfile ='output.Txt'; {输出文件名} Max =100; {最多点的数目} Big =10000; {最大整数值} Var F :Text; {文件变量} Po :Array[1..Max,1..2] Of Integer; {记录每个点坐标的数组} Dis :Array[1..Max,1..Max] Of Real; {记录动态规划中状态的权值} N :Integer; {点的总数} Procedure Init; {初始化过程} Var I :Integer; Begin Assign(F,Inputfile); {读入数据} Reset(F); Readln(F,N); For I:=1 To N Do Readln(F,Po[I,1],Po[I,2]); Close(F); End; Function Len(P1,P2:Integer):Real; {求两个点之间的距离} Begin Len:=Sqrt(Sqr(Po[P1,1]-Po[P2,1])+Sqr(Po[P1,2]-Po[P2,2])); End; Procedure Main; {动态规划过程} Var I,J,K :Integer; Now :Real; {当前最小值} Begin Dis[N,N]:=0; {初始化动态规划数组} For I:=N-1 Downto 1 Do Begin Dis[I,N]:=Len(I,I+1)+Dis[I+1,N]; Dis[N,I]:=Dis[I,N]; End; For I:=N-2 Downto 1 Do {递推最小值} For J:=N-1 Downto I+1 Do Begin If I+1N) And (X2<>N) Do Begin Ok:=True; {根据动态规划递推规则构造打印数组} If X1+1Dis[X1,X2]) Do Inc(I); If I<=N Then Begin Ok:=False; X1:=I; Inc(P[D]); Pr[D,P[D]]:=X1; Change; End; End; If Ok Then Begin I:=X2+1; While Dis[X1,I]+Len(I,X2)<>Dis[X1,X2] Do Inc(I); X2:=I; Inc(P[3-D]); Pr[3-D,P[3-D]]:=X2; End; End; While Pr[D,P[D]]<>N Do Begin Inc(P[D]); Pr[D,P[D]]:=Pr[D,P[D]-1]+1; End; For I:=1 To P[1] Do {输出打印数组} Write(F,Pr[1,I],' '); Writeln(F); For I:=1 To P[2] Do Write(F,Pr[2,I],' '); Close(F); End; Begin Init; {初始化} Main; {动态规划递推最短路径} Print; {输出结果} End.