版权声明:只要梦想一天,只要梦想存在一天,就可以改变自己的处境。 https://blog.csdn.net/dongyanwen6036/article/details/86437609
62.不同路径
Title:有一个机器人的位于一个M×N个网格左上角(下图中标记为’Start’)。
机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角(下图中标记为’Finish’)。
问有多少条不同的路径?
注意事项n和m均不超过100
Analysis:
典型的动态规划
问题
容易分析出状态转移方程:
dp[i][j] = dp[i-1][j] + dp[i][j-1];
初始条件,就是第一列和第一行,因为只能向下或向右走,所以,第一列和第一行的值都为1.
class Solution {
public:
int uniquePaths(int m, int n) {
if (0 > m || n < 0 || m>100 || n > 100)return 0;
vector<vector<int>>res(m, vector<int>(n, 1));
for(int i=1;i<m;i++)
for (int j = 1; j < n; j++)
{
res[i][j] = res[i - 1][j] + res[i][j-1];
}
return res[m - 1][n - 1];
}
};
static const auto kSpeedUp = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
63. 不同路径 II
和上一题一样,就是注意在初始状态时都初始为0。在全过程中,一遇到障碍物时就设置为0.
AC 0 ms:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid){
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
if (0 >= m || n <= 0 || m>100 || n > 100)return 0;
vector<vector<int>>res(m, vector<int>(n, 0));
//初始状态
for (int i = 0; i < m; i++)
if (obstacleGrid[i][0] == 0)
res[i][0] = 1;
else
break;
for (int i = 0; i < n; i++)
if (obstacleGrid[0][i] == 0)
res[0][i] = 1;
else
break;
for(int i=1;i<m;i++)
for (int j = 1; j < n; j++)
{
if (obstacleGrid[i][j] == 0)
res[i][j] = res[i - 1][j] + res[i][j - 1];
else
res[i][j] = 0;
}
return res[m - 1][n - 1];
}
};
static const auto kSpeedUp = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
64. 最小路径和
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
if (0 >= m || n <= 0)return 0;
vector<vector<int>>res(m, vector<int>(n, 0));
//和62,63一样先初始化边界值,动态规划思想一样
res[0][0] = grid[0][0];
for (int i = 1; i < m; i++)
res[i][0] = grid[i][0]+res[i-1][0];
for (int i = 1; i < n; i++)
res[0][i] = grid[0][i]+res[0][i-1];
for(int i=1;i<m;i++)
for (int j = 1; j < n; j++)
res[i][j]=grid[i][j]+ min(res[i - 1][j],res[i][j - 1]);
return res[m - 1][n - 1];
}
};
static const auto kSpeedUp = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();