1.矩阵最小路径问题
有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。
给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100
思路:首先创建和map等大小的二维数组dp
dp[i][j]=来到节点(i,j)的步数,要么是从(i-1,j)向下走的,要么是(i,j-1)向右走的
先填充第一行和第一列的dp矩阵
dp[0][0] = map[0][0]; //行列只有一个能走的方向 for (int i = 1; i < m; ++i) dp[0][i] = dp[0][i - 1] + map[0][i]; for (int i = 1; i < n; ++i) dp[i][0] = dp[i - 1][0] + map[i][0];
同时 d[i][j] = m[i][j] + min( dp[i-1][j],dp[i][j-1]);
for (int i = 1; i < n; ++i){ for (int j = 1; j < m; ++j){ dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + map[i][j]; } }
最终代码如下:
class MinimumPath { public: int getMin(vector<vector<int> > map, int n, int m) { // write code here vector<vector<int>> dp; dp.resize(n); for (int i = 0; i < n; ++i){ dp[i].resize(m); } dp[0][0] = map[0][0]; for (int i = 1; i < m; ++i) dp[0][i] = dp[0][i - 1] + map[0][i]; for (int i = 1; i < n; ++i) dp[i][0] = dp[i - 1][0] + map[i][0]; for (int i = 1; i < n; ++i){ for (int j = 1; j < m; ++j){ //dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + map[i][j]; dp[i][j] = (dp[i - 1][j]>dp[i][j - 1] ? dp[i][j - 1] : dp[i - 1][j]) + map[i][j]; } } return dp[n - 1][m - 1]; } };