动态规划真的可以为所欲为的(Leetcode 62/63)

看起来不错的运行效率
62题:

动态规划递推公式: 站在当前方块上可选择的路径数量 = 我正下方那个方块可选择的路径数量 + 我右侧那个方块可选择的路径数量;
边界情况: 棋盘上最右边那列只能选择往下走,所以dp[i][n-1]=1;
棋盘最下面那一行只能选择往右面走,所以dp[m-1][j] = 1;
进一步优化:重复利用一行数组代替m*n的dp数组,节省空间。

class Solution {
public:
    int uniquePaths(int m, int n) {
        int* dp = new int[n];
        memset(dp,0,sizeof(int)*n);
        
        for(int i=m-1;i>=0;i--)
        {
            dp[n-1] = 1;
            for(int j=n-2;j>=0;j--)
            {
                dp[j] = dp[j] + dp[j+1];
            }
        }
        return dp[0];
    }
};
63题:

与62题的不同:凡是放了障碍物的地方dp[i][j]设置成零。如果最右侧一列上任意一个位置有障碍物,那么它以及它正上方的所有方块可选路径为0,也就是dp[i][n-1] = 0;

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size(),n;
        if(m>0) n = obstacleGrid[0].size();
        else return 0;
        
        int* dp = new int[n];
        memset(dp,0,sizeof(int)*n);
        
        for(int i=m-1;i>=0;i--)
        {
            if(obstacleGrid[i][n-1]==1||i+1<m&&dp[n-1]==0) dp[n-1] = 0;
            else dp[n-1] = 1;
            for(int j=n-2;j>=0;j--)
            {
                if(obstacleGrid[i][j]==1) dp[j] = 0;
                else  dp[j] = dp[j]+dp[j+1];
            }
        }
        return dp[0];
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 8,844评论 0 18
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 5,371评论 0 2
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,354评论 0 33
  • 夜深人静,黎明将至,看看怀里,喝奶之后,浑身热乎,呼吸均匀的孩子,心里突然额外的踏实,虽然有点疲惫,但是也有很...
    芯夏夏阅读 1,313评论 0 0
  • 人类一直自诩站在食物链顶端,这是谁的规定?生态系统从来不是因为某种生物而独立出现的,是谁规定那些人类可以这样肆意浪...
    苏宇城阅读 2,934评论 8 3