栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

DP路径的数目的系列问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

DP路径的数目的系列问题

class Solution {
         public int uniquePaths(int m, int n) {
        if(m==1&&n==1){
            return 1;
        }
        int dp[][]=new int[m][n];
        for (int i = 0; i < n; i++) {
            dp[0][i]=1;
        }
        for (int i = 1; i < m; i++) {
            dp[i][0]=1;
            for (int j = 1; j < n; j++) {
                dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }



}

暴力枚举

 public int minPathSum(int[][] grid) {
        int n=grid.length;//行
        int m=grid[0].length;//列
        if (n==0&&m==0){
            return 0;
        }
        return helper(n,m,grid);
    }

    
    private int helper(int n, int m, int[][] grid) {
        if(n==0&&m==0){
            return grid[0][0];
        }else if(n==0){
            return helper(n,m-1,grid)+grid[n][m];
        }else if(m==0){
            return helper(n-1,m,grid)+grid[n][m];
        }
        return Math.min(helper(n-1,m,grid),helper(n,m-1,grid))+grid[n][m];

    }

 优化

剪枝

class Solution {
 public int minPathSum(int[][] grid) {
        int n=grid.length;//行
        int m=grid[0].length;//列
        int dp[][]=new int[n+1][m+1];
        for (int rows[]: dp) {
            Arrays.fill(rows,-1);
        }
        if (n==0&&m==0){
            return 0;
        }
        return helper(n-1,m-1,grid,dp);
    }

    
    private int helper(int n, int m, int[][] grid, int[][] dp) {
        if(dp[n][m]!=-1){
            return dp[n][m];
        }
        if(n==0&&m==0){
            return grid[0][0];
        }else if(n==0){
            dp[n][m]=helper(n,m-1,grid, dp)+grid[n][m];
            return dp[n][m];
        }else if(m==0){
            dp[n][m]=helper(n-1,m,grid, dp)+grid[n][m];
            return dp[n][m];
        }
        dp[n][m]=Math.min(helper(n-1,m,grid, dp),helper(n,m-1,grid, dp))+grid[n][m];
        return dp[n][m];

    }
}

自底向上的动态规划

class Solution {
         public int minPathSum(int[][] grid) {
        //base case 
        int n=grid.length;
        int m=grid[0].length;
        int dp[][]=new int[n+1][m+1];//左上角到[i][j]的最短步数(带权值)
        //base case
        dp[0][0]=grid[0][0];
        for (int i = 1; i < m; i++) {
            dp[0][i]=dp[0][i-1]+grid[0][i];
        }
        for (int i = 1; i < n; i++) {
            dp[i][0]=dp[i-1][0]+grid[i][0];
        }
        for (int i = 1; i  
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019164.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号