标签:
Well, this problem is a traditional dynamic programming problem. Suppose the minimum path sum of arriving at point (i, j)
is S[i][j]
, then we have the following state equation:
S[i][j] = min(S[i - 1][j], S[i][j - 1]) + grid[i][j]
Well, some boundary conditions need to be handled. The boundary conditions happen only on the topmost row (S[i - 1][j]
does not exist) and the leftmost column (S[i][j - 1]
does not exist). Suppose grid
is like [1, 1, 1, 1]
, then the minimum sum to arrive at each point is simply an accumulation of previous points and the result is [1, 2, 3, 4]
.
Now we have the following (unoptimized) code.
1 int minPathSum(vector<vector<int>>& grid) { 2 int m = grid.size(); 3 int n = grid[0].size(); 4 vector<vector<int> > sum(m, vector<int>(n, grid[0][0])); 5 for (int i = 1; i < m; i++) 6 sum[i][0] = sum[i - 1][0] + grid[i][0]; 7 for (int j = 1; j < n; j++) 8 sum[0][j] = sum[0][j - 1] + grid[0][j]; 9 for (int i = 1; i < m; i++) 10 for (int j = 1; j < n; j++) 11 sum[i][j] = min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j]; 12 return sum[m - 1][n - 1]; 13 }
As can be seen, each time when we update sum[i][j]
, we only need sum[i - 1][j]
(at the current column) and sum[i][j - 1]
(at the previous column), thus we need not maintain the fullm*n
matrix. Maintaining two columns is enough.
Taking this into consideration, we have the following code.
1 int minPathSum(vector<vector<int>>& grid) { 2 int m = grid.size(); 3 int n = grid[0].size(); 4 vector<int> pre(m, grid[0][0]); 5 vector<int> cur(m, 0); 6 for (int i = 1; i < m; i++) 7 pre[i] = pre[i - 1] + grid[i][0]; 8 for (int j = 1; j < n; j++) { 9 cur[0] = pre[0] + grid[0][j]; 10 for (int i = 1; i < m; i++) 11 cur[i] = min(cur[i - 1], pre[i]) + grid[i][j]; 12 pre = cur; 13 } 14 return pre[m - 1]; 15 }
标签:
原文地址:http://www.cnblogs.com/jcliBlogger/p/4548053.html