dp算法篇Day2

dp算法篇Day2_第1张图片

 "怎么过啊,怎么过啊?"


 

6、不同路径Ⅱ

(1) 题目解析

dp算法篇Day2_第2张图片

        这道路径选择题同上一篇的最后一道题就是类似的,只不过多了一个设置了障碍物的场景。我们只需要把障碍物分为一种情况讨论,和没有障碍物的情况又分为一种讨论即可。 

class Solution {
public:
    int uniquePathsWithObstacles(vector>& ob) {
        int m = ob.size();
        int n = ob[0].size();
        vector> dp(m+1,vector(n+1));
        dp[0][1] = 1;

        for(int i=1; i<=m; ++i){
            for(int j=1; j<=n; ++j){
                // 遇到障碍物
                if(ob[i-1][j-1] == 0)
                   dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m][n];
    }
};

 


7、礼物的最大价值

(1) 题目解析

dp算法篇Day2_第3张图片

class Solution {
public:
    int maxValue(vector>& grid) {
        int m = grid.size();
        int n = grid[0].size();

        vector> dp(m+1,vector(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]) + grid[i-1][j-1];
            }
        }

        return dp[m][n];
    }
};

 


 8、下降路径的最小和

(1) 题目解析

dp算法篇Day2_第4张图片

        本题的重点在于,从(i,j)位置 到下一行有三种走法! 但是可能 原始的表不够,因此我们选择增添一行两列,让我们的状态表达式不会发生越界访问~ 

class Solution {
public:
    int minFallingPathSum(vector>& matrix) {
        int n = matrix.size();

        // 构建dp表
        vector> dp(n+1,vector(n+2,INT_MAX));
        // 初始化表
        for(int j=0; j

 


9、最小路径和

(1) 题目解析

dp算法篇Day2_第5张图片

         本道题仍然和普通的路径分析没什么区别,唯一注意的是,增添表填值注意改变。

class Solution {
public:
    int minPathSum(vector>& grid) {
        int m = grid.size();
        int n= grid[0].size();
        vector> dp(m+1,vector(n+1,INT_MAX));
        dp[0][1] = 0;
        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];
    }
};

10、地下城游戏

(1) 题目解析 

方法一: 以...为结尾

dp算法篇Day2_第6张图片

        方案一涉及到数据具有后效性问题,也就意味着不能直接得到准确的dp[i][j],其受到多个因素的影响。

 方法二: 以...为起dp算法篇Day2_第7张图片

        方案二的思路,是以(i,j)为起点,更新最低的勇士健康数,影响它数值的大小仅仅只有前一个格子(i,j+1) 或者 下一个格子(i+1,j)。此外,条件初始化也是个值得考虑的问题,因为勇士要拯救公主,踏过最后一间房屋的血量一定得 >= 1。届时,dp表示的是以(i,j)位置到终点的最低血量,因此最后的返回值填上dp[0][0]即起点即可。

class Solution {
public:
    int calculateMinimumHP(vector>& dg) {
        int m = dg.size();
        int n = dg[0].size();

        vector> dp(m+1,vector(n+1,INT_MAX));
        // 初始化
        dp[m][n-1] = 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][j + 1], dp[i + 1][j]) - dg[i][j];
                dp[i][j] = max(1, dp[i][j]);
            }
        }

        return dp[0][0];
    }
};

本篇就到此结束,感谢你的阅读。

祝你好运,向阳而生~

dp算法篇Day2_第8张图片

 

你可能感兴趣的:(dp动规算法,算法,c++,开发语言)