这三题都是简单的动态规划题目,Unique Paths其实结果是C(m+n-2,n-1),因为m.n 的值比较大时,不方便用求阶乘的方式直接求,容易溢出,所以,使用动态规划类似二项式拆解的方式进行求解
class Solution {
public:
int uniquePaths(int m, int n) {
if(m<=1)return m;
if(n<=1)return n;
int map[m+1][n+1];
memset(map,0,sizeof(map));
for(int i=0;i<n;i++)map[0][i]=1;
for(int i=0;i<m;i++)map[i][0]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
map[i][j]=map[i-1][j]+map[i][j-1];
}
return map[m-1][n-1];
}
};
Unique Paths II 在上一题的基础上加上了障碍,因此只要在上一题求解的基础上,对于障碍处通过绕开的计数方式即可
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int m=obstacleGrid.size();
if(m==0)return 0;
int n=obstacleGrid[0].size();
if(n==0)return 0;
int map[m+1][n+1];
memset(map,0,sizeof(map));
if(obstacleGrid[0][0]==1)return 0;
map[0][0]=1;
for(int i=1;i<n;i++){
if(obstacleGrid[0][i]==1)
map[0][i]=0;
else map[0][i]=map[0][i-1];
}
for(int i=1;i<m;i++){
if(obstacleGrid[i][0]==1)
map[i][0]=0;
else map[i][0]=map[i-1][0];
}
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]==0)
map[i][j]=map[i-1][j]+map[i][j-1];
else map[i][j]=0;
}
return map[m-1][n-1];
}
};
Minimum Path Sum 则通过min res[i][j]=min(res[i-1][j],res[i][j-1])+map[i][j],其中map 为记录原始的值的矩阵,不断向下向右可得
class Solution {
public:
int minPathSum(vector<vector<int> > &grid) {
int len1=grid.size();
if(len1==0)return 0;
int len2=grid[0].size();
for(int i=1;i<len1;i++)grid[i][0]+=grid[i-1][0];
for(int i=1;i<len2;i++)grid[0][i]+=grid[0][i-1];
for(int i=1;i<len1;i++){
for(int j=1;j<len2;j++){
if(grid[i-1][j]<grid[i][j-1])
grid[i][j]+=grid[i-1][j];
else
grid[i][j]+=grid[i][j-1];
}
}
return grid[len1-1][len2-1];
}
};