Spurs

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Given an m x n grid filled with nonnegative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

动态规划问题.

  1. 状态转移公式: F[i,j] = min(F[i,j-1], F[i-1,j]) + A[i,j]
  2. 最优子结构: F[i,j-1], F[i-1,j] 和 A[i,j]
  3. 边界: F[0,0] = A[0,0];

参照例子:

1 2 3 4
4 3 2 1
2 1 2 3

实现中有三种选择:

  1. 最优的: \(O(m*n)\) time, \(O(min(m, n))\) extra space;(maintain an array)
  2. 次优的: \(O(m*n)\) time, \(O(m)+O(n)\) extra space;(维护俩数组,长度分别m, n)
  3. 最差的: \(O(m*n)\) time, \(O(m*n)\) extra space.(maintain a matrix, m*n)

自个想法,自个最优空间复杂度代码:
\(O(m*n)\) time, \(O(min(m, n))\) extra space;

// method 2
// DP
// F[i,j] = min(F[i,j-1], F[i-1,j] + A[i,j])
// O(m*n) time, O(min(m,n)) extra space
int minPathSum(vector<vector<int>>& A) {
	const int m = A.size(), n = A[0].size();
	if (m == 0) return 0;
	if (m == 1 && n == 1) return A[0][0];

	vector<int> dp(n);

	// load the 0st row of A into dp  
	dp[0] = A[0][0];
	for (int j = 1; j < n; j++)
		dp[j] = A[0][j] + dp[j - 1];

	// fill none first row and col in dp by state transfer equation
	for (int i = 1; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (j == 0) dp[j] = dp[j] + A[i][0];
			else dp[j] = min(dp[j - 1], dp[j]) + A[i][j];
		}
	}
	return dp[n - 1];
}

自个想法,自个差空间复杂度代码:
\(O(m*n)\) time, \(O(m*n)\) extra space;

// method 1
// DP
// F[i,j] = min(F[i,j-1], F[i-1,j]) + A[i,j]
// O(m*n) time, O(m*n) extra space
// not good
int minPathSum(vector<vector<int>>& A) {
	const int m = A.size(), n = A[0].size();
	if (m == 0) return 0;
	if (m == 1 && n == 1) return A[0][0];

	// initialize dp(m*n) matrix
	vector < vector<int> > dp(m);
	for (int i = 0; i < m; i++)
		dp[i].resize(n);

	// fill first row in dp
	dp[0][0] = A[0][0];
	for (int j = 1; j < n; j++)
		dp[0][j] = A[0][j] + dp[0][j - 1];

	// fill first col in dp
	for (int i = 1; i < m; i++)
		dp[i][0] = A[i][0] + dp[i - 1][0];

	// fill none first row and col in dp by state transfer equation
	for (int i = 1; i < m; i++) {
		for (int j = 1; j < n; j++) {
			dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + A[i][j];
		}
	}
	return dp[m - 1][n - 1];
}
posted on 2017-09-02 11:59  英雄与侠义的化身  阅读(120)  评论(0编辑  收藏  举报