1、不同路径(难度:中等)
AC代码
只有两种路可走,一个是向下,一个是向右。
class Solution {
public:
int uniquePaths(int m, int n) {
//以m为行,n为列,创建二维数组
vector <vector<int>> dp(m+1,vector<int>(n+1));
dp[0][1]=1;
dp[1][0]=1;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
//当只有一行,或者只有一列时,只有一种方法,就是沿着一条直线
if(i==0 || j==0){
dp[i][j]=1;
}
else{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
};
2、最小路径和(难度:中等)
AC代码
和题目不同路径一个思路
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
//1、定义子问题
//2、子问题递推关系
//3、确定dp数组的计算顺序
//dp数组存储路径上的最小数字总和
int m=grid.size();//行数
int n=grid[0].size();//列数
cout<<"行数"<<m<<"列数"<<n<<endl;
//初始化dp数组
vector <vector<int>> dp(m+1,vector<int>(n+1));
dp[0][0]=grid[0][0];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0 || j==0){
if(i==0 && j==0){
dp[i][j]=dp[0][0];
}
if(i==0 && j!=0){
dp[i][j]=dp[i][j-1]+grid[i][j];
}
if(j==0 && i!=0){
dp[i][j]=dp[i-1][j]+grid[i][j];
}
}
else{
dp[i][j]=min(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);
}
}
}
return dp[m-1][n-1];
}
};