牛客–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;
}
}