【解题报告】走路的学问
作者:互联网
题目描述
如图:A到B的街区尺寸为4*5。A为左上,B为右下,从A走到B,只能向右或向下走,不绕路。输入A点和B点的坐标,如果街区之间的代价不一样,怎么求最短路径?
输入要求
第一行,输入一个整数n,1<n<100,表示街区的尺寸为n*n
第二行开始,输入n+n-1行数据,表示每段街区的代价
其中第1行代价为n-1个整数,表示该行从左向右走的横向代价值
第2行代价为n个整数,表示该行从上向下走的纵向代价值
以此类推
输出要求
从左上到右下的最短路径
输入样例
3
1 9
8 2 9
8 3
4 9 2
9 7
输出样例
8
来源
NBU OJ
#include "iostream"
#include "stdio.h"
using namespace std;
int main() {
// freopen("in.txt", "r", stdin);
int n;
int row[100][100], column[100][100], value[100][100];
cin >> n;
//将一个点对应一对行列看作一组 则每个点读取一次向右和向下的权值
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1; j++) {
cin >> row[i][j];
}
for (int j = 0; j < n; j++) {
cin >> column[i][j];
}
}
// 最后一行的行
for (int j = 0; j < n - 1; j++) {
cin >> row[n-1][j];
}
// 左上角value
value[0][0] = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0)//左上角直接跳
continue;
if (i == 0) { //第一行的点只有从左边来的唯一路径
value[i][j] = value[i][j - 1] + row[i][j - 1];
continue;
}
if (j == 0) { //第一列的点只有从上边来的唯一路径
value[i][j] = value[i - 1][j] + column[i - 1][j];
continue;
}
//非特殊点则判断哪条路来的权值最小
int k = value[i][j - 1] + row[i][j - 1];
int kk = value[i - 1][j] + column[i - 1][j];
value[i][j] = k < kk ? k : kk;
}
}
cout << value[n - 1][n - 1] << endl;
return 0;
}
标签:int,cin,value,++,解题,100,走路,学问,row 来源: https://blog.csdn.net/gongfpp/article/details/122029698