Given a m x n grid filled with non-negative 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.
Example:
Input: [ [1,3,1], [1,5,1], [4,2,1] ] Output: 7 Explanation: Because the path 1→3→1→1→1 minimizes the sum.
最小路径和。题意是给一个二维矩阵,每个格子上都有一个非负整数。请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
这是动态规划的入门题。DP[i][j]的含义是代表走到坐标(i, j)位置的最小路径和。初始状态dp[0][0] = grid[0][0],因为对于某一个坐标来说,只会是从上面一个单元格或者是左边的一个单元格过来,所以转移方程是dp[i][j] = min(dp[i−1][j], dp[i][j−1]) + grid[i][j]。
时间O(mn)
空间O(1)
Java实现
1 class Solution { 2 public int minPathSum(int[][] grid) { 3 int m = grid.length; 4 int n = grid[0].length; 5 int[][] dp = new int[m][n]; 6 dp[0][0] = grid[0][0]; 7 for (int i = 1; i < m; i++) { 8 dp[i][0] = dp[i - 1][0] + grid[i][0]; 9 } 10 11 for (int j = 1; j < n; j++) { 12 dp[0][j] = dp[0][j - 1] + grid[0][j]; 13 } 14 15 for (int i = 1; i < m; i++) { 16 for (int j = 1; j < n; j++) { 17 dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; 18 } 19 } 20 return dp[m - 1][n - 1]; 21 } 22 }
JavaScript实现
1 /** 2 * @param {number[][]} grid 3 * @return {number} 4 */ 5 var minPathSum = function (grid) { 6 for (let i = 0; i < grid.length; i++) { 7 for (let j = 0; j < grid[0].length; j++) { 8 if (i == 0 && j != 0) { 9 grid[i][j] += grid[i][j - 1]; 10 } 11 if (j == 0 && i != 0) { 12 grid[i][j] += grid[i - 1][j]; 13 } 14 if (i != 0 && j != 0) { 15 grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]); 16 } 17 } 18 } 19 return grid[grid.length - 1][grid[0].length - 1]; 20 };
相关题目