题意:给出一个带权矩阵,一开始人在第1行,只能向下,左,右三个方向走,走到每一个点(i,j)都要支付a[i,j]的费用,
求一条从第1行到第n行的最小费用路径.
分析:DP,f[i,j]表示到(i,j)时的最优值.f[i,j]=min(f[i-1,j],f[i,j+1],f[i,j-1]).
用d[i,j]记录走的方向.注意更新顺序.
code:
const oo=2100000000; var f,cost,d:array[0..110,0..510] of longint; res:array[0..50000] of longint; up,left,right,ans:longint; n,m,i,j,pos,from,x,y,tot:longint; begin readln(n,m); for i:=1 to n do begin for j:=1 to m do read(cost[i,j]); readln; end; for i:=1 to m do f[1,i]:=cost[1,i]; for i:=2 to n do begin f[i,1]:=f[i-1,1]+cost[i,1]; d[i,1]:=1; for j:=2 to m do begin f[i,j]:=f[i-1,j]+cost[i,j]; d[i,j]:=1; if f[i,j]>f[i,j-1]+cost[i,j] then begin f[i,j]:=f[i,j-1]+cost[i,j]; d[i,j]:=2; end; end; for j:=m-1 downto 1 do if f[i,j]>f[i,j+1]+cost[i,j] then begin f[i,j]:=f[i,j+1]+cost[i,j]; d[i,j]:=3; end; end; ans:=oo; for i:=1 to m do if f[n,i]<ans then begin ans:=f[n,i]; pos:=i; end; x:=n; y:=pos; while x<>1 do begin inc(tot); res[tot]:=y; case d[x,y] of 1:dec(x); 2:dec(y); 3:inc(y); end; end; inc(tot); res[tot]:=y; for i:=tot downto 1 do writeln(res[i]); end.