1、给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和,假设矩阵大小为M*N
解析:这是一道经典的动态规划的题目。m[i][j]代表输入矩阵某一点的路径长度,dp[i][j]代表到(i,j)点的最短路径长度,dp[i][j]=min(dp[i-1][j],dp[i][j-1])+m[i][j].
#include<iostream>
#include<vector>
using namespace std;
int min(int v1, int v2);
int main() {
int i = 0, j = 0;
int M = 0, N = 0;
/*给二维vector赋值*/
cin >> M >> N;
vector<vector<int>> m(M,vector<int>(N));
vector<vector<int>>dp(M,vector<int>(N));
vector<int> mm(N);
/*使用数组方式赋值*/
//for (i = 0; i < M; i++) {
// for (j = 0; j < N; j++) {
// cin >> m[i][j];
// }
//}
/*使用迭代器方式赋值*/
for (auto it_vv = m.begin(); it_vv != m.end(); ++it_vv) {
for (auto it_v = it_vv->begin(); it_v != it_vv->end(); it_v++) { //迭代器的使用方法和指针类似
cin >> *it_v;
}
}
dp[0][0] = m[0][0];
for (i = 1; i < M; i++) {
dp[i][0] = m[i - 1][0] + m[i][0];
}
for (j = 1; j < N; j++) {
dp[0][j] = dp[0][j - 1] + m[0][j];
}
for (i = 1; i < M; i++) {
for (j = 1; j < N; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + m[i][j];
}
}
cout << "the minimum path is : " << dp[M - 1][N - 1] << endl;
}
int min(int v1, int v2) {
if (v1 > v2) return v2;
else return v1;
}