街道问题(way.pas/c/cpp)

 

街道问题

(way.pas/c/cpp)

来源:《奥赛经典》(提高篇)

【问题描述】

  
如图所示的矩形图中找到一条从左下角到右上角的最短路径,图中数字表示边的长度。只能向右或向上走。

【输入文件】

第一行两个数,N,M 矩形的点有N行M列。(0<N,M<1000)

接下来N行每行M-1个数描述横向边的长度。

接下来N-1行每行M个数描述纵向边的长度。

边的长度小于10。

【输出文件】

    一个数——最短路径长度。

【输入样例】

4 5

3 7 4 8

4 6 3 5

3 6 3 5

5 4 6 2

7 6 3 5 3

2 8 5 9 4

8 7 4 3 7

【输出样例】

    28

====================

========================

{
ID:jie19952
PROG:
LANG:PASCAL
}
var
  n,m:longint;
  map_h,map_z:array[0..1001,0..1001]of longint;
  f:array[0..1001,0..1001]of longint;

procedure init;
begin
  assign(input,'way.in');
  assign(output,'way.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

function min(a,b:longint):longint;
begin
  if a>b then exit(b);
  exit(a);
end;

procedure main;
var
  i,j:longint;
begin
  readln(n,m);
  for i:=1 to n do
    for j:=2 to m do
      read(map_h[i,j]);
  for i:=1 to n-1 do
    for j:=1 to m do
      read(map_z[i,j]);
  fillchar(f,sizeof(f),$7);
  f[n,1]:=0;
  for i:=n downto 1 do
    for j:=1 to m do
      begin
        f[i-1,j]:=min(f[i-1,j],f[i,j]+map_z[i-1,j]);
        f[i,j+1]:=min(f[i,j+1],f[i,j]+map_h[i,j+1]);
      end;
  writeln(f[1,m]);
end;

begin
  init;
  main;
  terminate;
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值