动态规划2:矩阵最小路径问题

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];
	}
};

猜你喜欢

转载自blog.csdn.net/qq_24950821/article/details/80642236