1.不同路径
不同路径
思路:
状态表示
状态转移方程
class Solution {
public:
int uniquePaths(int m, int n) {
// 创建dp表
// 初始化
// 填表
// 返回值
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
dp[0][1] = 1;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
return dp[m][n];
}
};
2.不同路径ii
不同路径ii
思路:
注意障碍物如何分析
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obs) {
// 创建dp表
// 初始化
// 填表
// 返回值
int m = obs.size(), n = obs[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
dp[0][1] = 1;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
if(obs[i - 1][j - 1] != 1)
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
return dp[m][n];
}
};
3.珠宝的最高价值
珠宝的最高价值
思路:
状态表示
状态转移方程
class Solution {
public:
int jewelleryValue(vector<vector<int>>& frame) {
// 创建dp表
// 初始化
// 填表
// 返回值
int m = frame.size(), n = frame[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + frame[i - 1][j - 1];
return dp[m][n];
}
};
4.下降路径最小和
下降路径最小和
思路:
注意初始化
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
// 创建dp表
// 初始化
// 填表
// 返回值
int n = matrix.size();
vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));
for(int j = 0; j < n + 2; j++) dp[0][j] = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j + 1])) + matrix[i - 1][j - 1];
int ret = INT_MAX;
for(int j = 1; j <= n; j++)
ret = min(ret, dp[n][j]);
return ret;
}
};
5.最小路径和
最小路径和
思路:动态规划
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
// 创建dp表
// 初始化
// 填表
// 返回值
int m = grid.size(), n = grid[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
dp[0][1] = dp[1][0] = 0;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
return dp[m][n];
}
};
6.地下城游戏
地下城游戏
思路:
特别注意这里的状态表示与前几个题的状态表示不同
状态表示
以i,j位置为起点,最小起始健康点数
状态转移方程
分向右和向下
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
// 创建dp表
// 初始化
// 填表
// 返回值
int m = dungeon.size(), n = dungeon[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
dp[m][n - 1] = dp[m - 1][n] = 1;
for(int i = m - 1; i >= 0; i--)
for(int j = n - 1; j >= 0; j--)
{
dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];
dp[i][j] = max(1, dp[i][j]);
}
return dp[0][0];
}
};