7-21 矩阵的最小路径和
给定一个矩阵matrix,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。
输入格式:
第一行为两个数字m和n(1≤m, n≤1000),分别表示矩阵的行数和列数。
接下来有m行,每行n个数字,数字之间用一个空格分隔。每个数字的值为不超过200的非负整数。
输出格式:
在一行中输出从左上角到右下角所有的路径中最小的路径和。
输入样例:
4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
输出样例:
12
样例解释:
路径1,3,1,0,6,1,0是所有路径和最小的,所以返回12。
可以使用动态规划,使用一个数组就可以了,为了方便,我将数组组成的地图周围都放入了很大的数,这样可以减少分析
#include <bits/stdc++.h>
using namespace std;
long long dp[1005][1005];
int main(){
int m,n;
cin>>m>>n;
//为数组赋值
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>dp[i][j];
}
}
//将数组周围的地方全部变成最大值,这样做的好处就是不用管地图的边缘。
for(int i=0;i<=n+1;i++){
dp[0][i]=9999999;
dp[m+1][i]=9999999;
}
for(int i=0;i<=m+1;i++){
dp[i][0]=9999999;
dp[i][n+1]=9999999;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i==1&&j==1){
continue;
}
else {
dp[i][j] += min(dp[i - 1][j], dp[i][j - 1]);
// cout<<dp[i][j]<<" "<<i<<" "<<j<<endl;可以用来分析代码运行过程
}
}
}
cout<<dp[m][n];
return 0;
}