最小代价问题

    xiaoxiao2021-03-25  108

    Description 设有一个n×m(小于100)的方格(如图所示),在方格中去掉某些点,方格中的数字代表距离(为小于100的数,如果为0表示去掉的点),试找出一条从A(左上角)到B(右下角)的路径,经过的距离和为最小(此时称为最小代价),从A出发的方向只能向右,或者向下。

    Sample Input 4 4 4 10 7 0 3 2 2 9 0 7 0 4 11 6 12 1

    Sample Output (1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4) 24

    var i,j,n,m:longint; a,k,d:array[-1..101,-1..101]of longint; f:array[-1..101,-1..101]of boolean; procedure print(x,y:longint); begin if (x=1)and(y=1) then begin write('(',x,',',y,')'); exit; end; if d[x,y]=1 then print(x,y-1) else print(x-1,y); write('->(',x,',',y,')'); end; begin readln(n,m); for i:=1 to n do for j:=1 to m do begin read(a[i,j]); if a[i,j]>0 then f[i,j]:=true; k[i,j]:=maxlongint div 2; end; for i:=1 to m do if f[1,i] then begin k[1,i]:=k[1,i-1]+a[1,i]; d[1,i]:=1; end; for i:=2 to n do if f[i,1] then begin k[i,1]:=k[i-1,1]+a[i,1]; d[i,1]:=2; end; for i:=2 to n do for j:=2 to m do if f[i,j] then if ((k[i-1,j]+a[i,j])<(k[i,j-1]+a[i,j]))and(f[i-1,j]) then begin d[i,j]:=2; k[i,j]:=k[i-1,j]+a[i,j]; end else if f[i,j-1]then begin d[i,j]:=1; k[i,j]:=k[i,j-1]+a[i,j]; end; print(n,m); writeln; writeln(k[n,m]-a[n,m]); end.

    在这题里面,加一个boolean的数组容易做一些。

    转载请注明原文地址: https://ju.6miu.com/read-5085.html

    最新回复(0)