街道问题
(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
#include
#include
int opt[1001][1001],x[1001][1000],y[1000][1001];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
inti,j;
for(i=n;i>=1;i--)
{
for(j=1;j
=1;i--)
{
for(j=1;j<=m;j++)
{
scanf("%d",&y[i][j]);
}
}
memset(opt,0,sizeof(opt));
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(i==1)
{
opt[i][j]=opt[i][j-1]+x[i][j-1];
}
if(j==1)
{
opt[i][j]=opt[i-1][j]+y[i-1][j];
}
else if (i>1&&i<=n&&j>1&&j<=m)
{
if(opt[i][j-1]+x[i][j-1]<=opt[i-1][j]+y[i-1][j])
{
opt[i][j]=opt[i][j-1]+x[i][j-1];
}
else
opt[i][j]=opt[i-1][j]+y[i-1][j];
}
}
}
printf("%d\n",opt[n][m]);
return0;
}