SSL 1460 最小代價問題

2021-07-27 11:07:01 字數 2026 閱讀 9036

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首先現將最上面那行和最左邊那行定初值。

用f[i,j]來判斷這個點是否為0如果為0,則為true。

那麼我們就可以用兩重迴圈,來枚舉行和列。如果這個點可以走,那就判斷是從上面走下來比較下,還是從左邊走過來比較小。還要判斷左邊或上面是否為0。

f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j]);

如果從上面來,則d[i,j]=2;從左來則為1。

最後倒推回去,找到路線和最終的最小代價值。

**如下:

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

dg(x,y:longint);

begin

if (x=1)and(y=1) then

begin

write('(',x,',',y,')'); exit; end;

if d[x,y]=1

then dg(x,y-1) else dg(x-1,y);

write('->(',x,',',y,')');

end;

begin

readln(n,m);

fillchar(f,sizeof(f),false);

for i:=1

to n do

begin

for j:=1

to m do

begin

read(a[i,j]);

if a[i,j]=0

then

begin a[i,j]:=maxlongint; f[i,j]:=true; end;

k[i,j]:=maxlongint div

2; end;

readln;

end;

for i:=1

to m do

if f[1,i]=false

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]=false

then

begin

k[i,1]:=k[i-1,1]+a[i,1];

d[i,1]:=2;

endelse

break;

for i:=2

to n do

for j:=2

to m do

if f[i,j]=false

then

if ((k[i-1,j]+a[i,j])

begin

d[i,j]:=2;

k[i,j]:=k[i-1,j]+a[i,j];

endelse

if f[i,j-1]=false

then

begin

d[i,j]:=1;

k[i,j]:=k[i,j-1]+a[i,j];

end;

dg(n,m);

writeln;

writeln(k[n,m]-a[n,m]);

end.

SSL 1460 最小代價問題

description 設有乙個n m 小於100 的方格 如圖所示 在方格中去掉某些點,方格中的數字代表距離 為小於100的數,如果為0表示去掉的點 試找出一條從a 左上角 到b 右下角 的路徑,經過的距離和為最小 此時稱為最小代價 從a出發的方向只能向右,或者向下。sample input 4 ...

SSL1763 觀光旅遊 最小環問題

在相同的起點與終點之間找出一最短路線。你的任務是編寫一條程式來找類似的的一條路線。在這個鎮上,有n個十字路口 編號1至n 兩個十字路口之間可以有多條道路連線,有m條道路 編號為1至m 但沒有一條道路從乙個十字路口出發又回到同乙個路口。每一條觀光路線都是由一些路組成的,這些道路序號是 y1,yk,且k...

SSL 1612 最優佈線問題(最小生成樹)

description 學校有n臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線是指它們之間有資料線連線。由於計算機所處的位置不同,因此不同的兩台計算機的連線費用往往是不同的。當然,如果將任意兩台計算機都用資料線連線,費用將是相當龐大的。為了節省費用,我們採用資料的間接傳輸手...