前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态规划真的可以为所欲为的(Leetcode 62/63)

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

作者头像
kalifa_lau
发布2018-04-28 14:36:08
6270
发布2018-04-28 14:36:08
举报
文章被收录于专栏:kalifaの日々kalifaの日々

看起来不错的运行效率

62题:

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

代码语言:javascript
复制
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;

代码语言:javascript
复制
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];
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.04.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 62题:
  • 63题:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档