牛客--unique-paths、unique-paths-ii、带权值的最小路径和、triangle

牛客–unique-paths

题目:一个机器人在m×n大小的地图的左上角(起点,下图中的标记“start"的位置)。 机器人每次向下或向右移动。机器人要到达地图的右下角。(终点,下图中的标记“Finish"的位置)。 可以有多少种不同的路径从起点走到终点? 牛客链接

典型的动态规划问题

代码:

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

牛客–unique-paths-ii

题目牛客链接

如果在图中加入了一些障碍,有多少不同的路径?

分别用0和1代表空区域和障碍

例如

下图表示有一个障碍在3*3的图中央。

[
    [0,0,0],
    [0,1,0],
    [0,0,0]
]

有2条不同的路径

代码:

public int uniquePathsWithObstacles (int[][] obstacleGrid) {
    // write code here
    int m=obstacleGrid.length;
    int n=obstacleGrid[0].length;
    int[][] dp=new int[m][n];
    for(int i=0;i<m;i++){
        if(obstacleGrid[i][0]==1)
            break;
        dp[i][0]=1;
    }
    for(int i=0;i<n;i++){
        if(obstacleGrid[0][i]==1)
            break;
        dp[0][i]=1;
    }
    for(int i=1;i<m;i++){
        for(int j=1;j<n;j++){
            if(obstacleGrid[i][j]==1){
                dp[i][j]=0;
            }else {
                dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
        }
    }
    return dp[m-1][n-1];
}

牛客–带权值的最小路径和

题目:给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。
注意:你每次只能向下或向右移动。

代码:

public class 带权值的最小路径和 {
    public int minPathSum (int[][] grid) {
        // write code here
        int m=grid.length;
        int n=grid[0].length;
        if(m==0 || n==0){
            return 0;
        }
        for(int i=1;i<m;i++){
            grid[i][0]=grid[i-1][0]+grid[i][0];
        }
        for(int i=1;i<n;i++){
            grid[0][i]=grid[0][i-1]+grid[0][i];
        }
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                grid[i][j]+= Math.min(grid[i-1][j],grid[i][j-1]);
            }
        }
        return grid[m-1][n-1];
    }
}

牛客–triangle

题目:给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,

例如,给出的三角形如下:

[↵     [2],↵    [3,4],↵   [6,5,7],↵  [4,1,8,3]↵]

最小的从顶部到底部的路径和是

2 + 3 + 5 + 1 = 11。

牛客链接

代码;

import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
    public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
        int m=triangle.size();
        int n=triangle.get(triangle.size()-1).size();
        int[][] dp=new int[m][n];
        dp[0][0]=triangle.get(0).get(0);
        for(int i=1;i<m;i++){
            dp[i][0]=triangle.get(i).get(0)+dp[i-1][0];
        }
        for(int i=1;i<m;i++){
            for(int j=1;j<=i;j++){
                if(j==i){
                    dp[i][j]=dp[i-1][j-1]+triangle.get(i).get(j);
                }else {
                    dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j-1])+triangle.get(i).get(j);
                }
            }
        }
        int size=dp.length;
        int result=dp[size-1][0];
        for(int i=0;i< size;i++){
            result=Math.min(dp[m-1][i],result);
        }
        return result;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值