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];}
};