zoukankan      html  css  js  c++  java
  • 最小路径和 -- 动态规划

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

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

    示例:

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

    解法一: 动态规划

    思想

    因为最近在做动态规划的专题,所以用动态规划的思想来解决本题目:
    我们新建一个dp数组,用来保存每走一步的最短路径,但是最后一个数值也就是最后一个元素肯定是有的;
    我们利用递推的公式:
    dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))
    即可,思想比较特殊,但是找到规律后还是很好理解的.

    代码

    public int minPathSum(int[][] grid) {
        
        int[][] dp = new int[grid.length][grid[0].length];
        for (int i = grid.length - 1; i >= 0; i--) {
            for (int j = grid[0].length - 1; j >= 0; j--) {
                if(i == grid.length - 1 && j != grid[0].length - 1)
                  dp[i][j] = grid[i][j] +  dp[i][j + 1];
                else if(j == grid[0].length - 1 && i != grid.length - 1)
                  dp[i][j] = grid[i][j] + dp[i + 1][j];
                else if(j != grid[0].length - 1 && i != grid.length - 1)
                  dp[i][j] = grid[i][j] + Math.min(dp[i + 1][j], dp[i][j + 1]);
                else
                  dp[i][j] = grid[i][j];
            }
        }
        return dp[0][0];
    }

    运行结果

    以上就是动态规划的方式解决最短路径和,在日后开发过程中,当讲到一种算法思想时,可以用于改题目,会增加新解(因本人目前在做动态规划的专题), 希望对大家有所帮助!!!

  • 相关阅读:
    VM VirtualBox安装Centos6.5
    桥接
    程序员工作心法
    策略模式-鸭子怎么飞-实例
    策略模式-用什么方式去上班呢 实例
    观察者模式-订报纸,语音呼叫系统实例
    门面(Facade)模式--医院,保安系统实例
    Promise实例的resolve方法
    Promise实例的any方法
    Promise实例的race方法
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11881012.html
Copyright © 2011-2022 走看看