package com.ljp.test.leetcode;
/**
* <b>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)
* 鏈接:<a >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];
? ? ? ? }
? ? }
}