• 矩阵的最小路径和


    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

    说明:每次只能向下或者向右移动一步。

    示例:

    输入:
    [
      [1,3,1],
    [1,5,1],
    [4,2,1]
    ]
    输出: 7
    解释: 因为路径 1→3→1→1→1 的总和最小。

    二维dp:

     1     public int minPathSum(int[][] grid) {
     2         if (grid == null || grid.length == 0 || grid[0].length == 0) {
     3             return 0;
     4         }
     5         int m = grid.length, n = grid[0].length;
     6         int[][] dp = new int[m][n];
     7         dp[0][0] = grid[0][0];
     8         for (int i = 0; i < m; i++) {
     9             for (int j = 0; j < n; j++) {
    10                 if (i == 0 && j != 0) {
    11                     dp[0][j] = dp[0][j - 1] + grid[i][j];
    12                 } else if (i != 0 && j == 0) {
    13                     dp[i][0] = dp[i][i - 1] + grid[i][j];
    14                 } else if (i != 0 && j != 0) {
    15                     dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
    16                 } else {
    17                     dp[i][j] = grid[i][j];
    18                 }
    19             }
    20         }
    21         return dp[m - 1][n - 1];
    22     }

     一维dp:

     1 public class T64 {
     2     public int minPathSum(int[][] grid) {
     3         if (grid == null || grid.length == 0 || grid[0].length == 0) {
     4             return 0;
     5         }
     6         int m = grid.length,n = grid[0].length;
     7         int[] dp = new int[n];
     8         for (int i = 0; i < m; i++) {
     9             for (int j = 0; j < n; j++) {
    10                 if (i == 0 && j != 0) {
    11                     dp[j] = dp[j - 1];
    12                 } else if (i != 0 && j == 0) {
    13                     dp[j] = dp[j];
    14                 } else if (i != 0 && j != 0) {
    15                     dp[j] = Math.min(dp[j - 1], dp[j]);
    16                 } else {
    17                     dp[j] = 0;
    18                 }
    19                 dp[j] = dp[j] + grid[i][j];
    20             }
    21         }
    22         return dp[n - 1];
    23     }
    24 }
    一回生,二回熟
  • 相关阅读:
    make_shared和shared_ptr的区别
    bitcoined
    ofstream的使用方法--超级精细。C++文件写入、读出函数(转)
    visual studio 安装过程
    Socket通信原理探讨(C++为例)
    以太坊的记录和关注点
    以太坊的应用
    以太坊
    比特币、以太坊
    c++
  • 原文地址:https://www.cnblogs.com/zzytxl/p/12446577.html
Copyright © 2020-2023  润新知