62. 求出路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
1. 定义数组元素的 的含义
使用一个数组来存取当前的路径,根据走动的方式来找到路径
2. 找出关系数组间的关系
对于机器人要想走到目标(i,j)点这个位置,机器人可以向下走或者向右走,
一种是从(i-1,j)这个位置到达
一种是从(i,j-1)这个位置到达.
类似于之前的状态转换,选和不选的问题
因为是计算所有可能的步骤,所有把所有能走的路径都相加起来
关系式为 dp[i][j]=dp[i-1][j]+dp[i][j-1]
3. 找出初始值
因为机器人只能向下走或向右走,所以上面一列和左下一列都是1
因为只有一种路径能走到这些位置,所以初始化这些位置
public int uniquePaths(int m, int n) {
if(m<=0||n<=0) return 0;
int[][] ints=new int[m ][n];
for (int i = 0; i <m ; i++) {
ints[m][0]=1;//相当于最左面的一列 ,机器人只能一直下走
}
for (int i = 0; i <n ; i++) {
ints[0][n]=1;
//相当于上面 ,机器人只能一直左走
}
//一种走法是inta[i-1,j] 一种是inta[i,j-1]
for (int i = 1; i < m; i++) {
for (int j = 1; j <n; j++) {
ints[i][j]=ints[i-1][j]+ints[i][j-1];
}
}
return ints[m-1][n-1];
}
64 .最短路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
这一题和上一题都差不多,将初始值求出,然后一步一步优化记录就行
public int minPathSum(int[][] grid) {
if (grid.length<=0) return 0;
int[][] sum=new int[grid.length ][grid[0].length];
int s=0;
sum[0][0] =grid[0][0];//初始化
for (int i = 1; i <grid.length; i++) {
sum[i][0]=sum[i-1][0]+grid[i][0];//左边的列
}
for (int i = 1; i <grid[0].length; i++) {
sum[0][i]=sum[0][i-1]+grid[0][i];//左边的列
}
for (int i = 1; i <grid.length; i++) {
for (int j = 1; j < grid[0].length; j++) {
sum[i][j]=Math.min(sum[i-1][j],sum[i][j-1])+grid[i][j];
}
}
return sum[grid.length-1][grid[0].length-1];
}