package com.ljp.test.leetcode;
/**
-
64. 最小路径和
-
-
给定一个包含非负整数的 mxn 网格grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
-
-
说明:每次只能向下或者向右移动一步。
-
-
-
示例 1:
-
-
-
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
-
输出:7
-
解释:因为路径 1→3→1→1→1 的总和最小。
-
示例 2:
-
-
输入:grid = [[1,2,3],[4,5,6]]
-
输出:12
-
-
提示:
-
-
m == grid.length
-
n == grid[i].length
-
1 <= m, n <= 200
-
0 <= grid[i][j] <= 100
-
-
来源:力扣(LeetCode)
-
链接:64. 最小路径和
-
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
-
@author luojunping
-
@since 2023-03-09 */ public class Number0064 {
public static void main(String[] args) { int[][] nums1 = {{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}; int[][] nums2 = {{1, 2, 3}, {4, 5, 6}}; System.out.println(DynamicPlanning.minPathSum(nums1)); System.out.println(DynamicPlanning.minPathSum(nums2)); }
/**
-
动态规划 */ private static class DynamicPlanning {
public static int minPathSum(int[][] nums) { int m = nums.length; int n = nums[0].length; int[][] dp = new int[m][n]; dp[0][0] = nums[0][0]; for (int i = 1; i < m; i++) { dp[i][0] = dp[i - 1][0] + nums[i][0]; } for (int i = 1; i < n; i++) { dp[0][i] = dp[0][i - 1] + nums[0][i]; } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { int minimum = Math.min(dp[i - 1][j], dp[i][j - 1]); dp[i][j] = minimum + nums[i][j]; } } return dp[m - 1][n - 1]; }
}
-
}