题目:
由于只能向右或向下,那某一点的上一步只能是左或上,设置 dp[i][j]表示到达 grid[i][j]的最小路径长度。 有:
$$ dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; $$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <vector> using std::vector;class Solution { public : int minPathSum (vector<vector<int > > &grid) { int i, j, m = grid.size (), n = grid[0 ].size (); vector<vector<int > > dp (m, vector <int >(n, 0 )); dp[0 ][0 ] = grid[0 ][0 ]; for (j = 1 ; j < n; j++) { dp[0 ][j] = dp[0 ][j - 1 ] + grid[0 ][j]; } for (i = 1 ; i < m; i++) { dp[i][0 ] = dp[i - 1 ][0 ] + grid[i][0 ]; } for (i = 1 ; i < m; i++) { for (j = 1 ; j < n; j++) { dp[i][j] = std::min (dp[i - 1 ][j], dp[i][j - 1 ]) + grid[i][j]; } } return dp[m - 1 ][n - 1 ]; } };
leetcode hot 100 rewrite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <vector> using std::vector;class Solution { public : int minPathSum (vector<vector<int > > &grid) { int i, j, m = grid.size (), n = grid[0 ].size (); vector<vector<int > > dp (m, vector <int >(n, 0 )); dp[0 ][0 ] = grid[0 ][0 ]; for (i = 1 ; i < m; i++) dp[i][0 ] = dp[i - 1 ][0 ] + grid[i][0 ]; for (j = 1 ; j < n; j++) dp[0 ][j] = dp[0 ][j - 1 ] + grid[0 ][j]; for (i = 1 ; i < m; i++) { for (j = 1 ; j < n; j++) dp[i][j] = std::min (dp[i - 1 ][j], dp[i][j - 1 ]) + grid[i][j]; } return dp[m - 1 ][n - 1 ]; } };