力扣62 不同路径
class Solution
{
public int uniquePaths(int m, int n)
{
int[][] dp=new int[m][n];
//dp[i][j]表示从(0,0)处到(i,j)这个位置有多少种不同的路径
dp[0][0]=0;
//由于只能向下走或者是向右走一步
//所以dp[i][0]也就是第一列,还有dp[0][j]也就是第一列都只有1种走法
//第一列全部置为1
for(int i=0;i<m;i++)
{
dp[i][0]=1;
}
//第一行全部置为1
for(int j=0;j<n;j++)
{
dp[0][j]=1;
}
//现在根据状态转移方程填上除了第一行第一列的其他位置
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
//到(i,j)这个位置要么上一步从(i-1,j)位置向下走一步,要么上一步从(i,j-1)位置向右走一步
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
力扣64 最小路径和
class Solution
{
public int minPathSum(int[][] nums)
{
//m*n的矩阵
int m=nums.length;
int n=nums[0].length;
//dp[i][j]的意思是从nums[0][0]到nums[i][j]的最小路径和
int[][] dp=new int[m][n];
dp[0][0]=nums[0][0];
for(int i=1;i<m;i++)
{
//由于只能往右走或者往下走,所以第一列的位置只能从上一行来
dp[i][0]=dp[i-1][0]+nums[i][0];
}
for(int j=1;j<n;j++)
{
//由于只能往右走或者往下走,所以第一行的位置只能从左边的一列来
dp[0][j]=dp[0][j-1]+nums[0][j];
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
//d[i][j]的上一行元素是d[i-1][j](列值相同)
//d[i][j]的左边一列元素是d[i][j-1](行值相同)
dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+nums[i][j];
}
}
return dp[m-1][n-1];
}
}
力扣63 不同路径||