Follow up for "Unique Paths":

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space are marked as 1 and 0 respectively in the grid.

For example,

There is one obstacle in the middle of a 3x3 grid as illustrated below.

[
[0,0,0],
[0,1,0],
[0,0,0]
]

The total number of unique paths is 2.

Note: m and n will be at most 100.

这是自己能独立做出来的DP类第二个题^^.

这题和上一题状体转移公式几乎一样.区别就是在 obstacles 的处理上.下面是方法:

核心思路:

  1. 先搞定第 0 行和第 0 列;
  2. 第 0 行和第 0 列若有障碍, 则该处及后面的都 = 0;
  3. 非0行、列,则按公式填写 bp matrix, 从 row=1, col=1开始. 若遇 obstacle, 该处设置为0.

注意处理 special caseif(A[0][0] = 1) return 0;

为了搞起来方便,申请了一个 m*n 的二维数组.但似乎只申请 n 维的一维数组就足够了.先不管啦.

自己思路,自个媳妇:

\(O(m*n)\) time, \(O(m*n)\) extra space.

// 思路:
// 1. 先搞定第 0 行和第 0 列;
// 2. 第 0 行和第 0 列若有障碍, 则该处及后面的都 = 0;
// 3. 非0行、列,则按公式填写 bp matrix, 从 row=1, col=1开始.
// 若遇 obstacle, 该处设置为0.
int uniquePathsWithObstacles(vector<vector<int>>& A) {
const int m = A.size(), n = A[0].size();
// special case
if (m == 0 || A[0][0] == 1)
return 0; vector<vector<int>> dp(m); // dp[m*n] initializaion
for (int i = 0; i < m; i++)
dp[i].resize(n); // 初始化bp的行
for (int j = 0; j < n; j++) {
if (A[0][j] == 0)
dp[0][j] = 1;
else { // point A[0,j] is an obstacle
dp[0][j] = 0;
break; // 第0行若有障碍,则该处及后面的都 = 0
}
} // 初始化bp的列
for (int i = 1; i < m; i++) {
if (A[i][0] == 0)
dp[i][0] = 1;
else { // point A[i,0] is an obstacle
dp[i][0] = 0;
break; // 第0列若有障碍,则该处及后面的都 = 0
}
} // 按公式填写bp matrix, 从 row=1, col=1开始
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (A[i][j] == 1)
dp[i][j] == 0; //障碍处设置为0
// dp的状态转移公式
else if (A[i][j] == 0)
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
return dp[m - 1][n - 1];
}

随机推荐

  1. maven编译时出现读取XXX时出错invalid LOC header (bad signature)

    问题原因 该包没有下载正确. 解决办法 找到该包的目录,删除该包重新下载即可. 重新下载后用maven test一下,红叉消失.

  2. 新概念英语(1-25)Mrs. Smith's Kitchen

    What colour is the electric cooker? Mrs. Smith's Kitchen is small. There is a refrigerator in the ki ...

  3. slf4j入门

    一.官方说明: The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for vari ...

  4. Hibernat 原生SQL运行结果集处理方法

    hibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的. Session.createSQLQuery(); 使用list()方法可以把Session.createSQLQuer ...

  5. nginx反向代理二级域名注意事项

    摘要 本文介绍了利用nginx实现多域名和多站点的绑定的方法及相关注意事项.您也可以只看本文的标题或红色标注部分.☺ 1.应用场景 我们经常会遇到在同一台服务器建立多个Web站点的情况,普遍的做法是为 ...

  6. 文本编辑器(KindEditord)

    1.下载 官网下载:http://kindeditor.net/down.php 本地下载:http://files.cnblogs.com/files/wupeiqi/kindeditor_a5.z ...

  7. Java四种线程池的学习与总结

    在Java开发中,有时遇到多线程的开发时,直接使用Thread操作,对程序的性能和维护上都是一个问题,使用Java提供的线程池来操作可以很好的解决问题. 一.new Thread的弊端 执行一个异步任 ...

  8. ES6 new syntax of Default Function Parameters

    Default Function Parameters.md Default Function Parameters function getSum(a,b){ a = (a !== undefine ...

  9. Python网络爬虫笔记(五):下载、分析京东P20销售数据

    (一)  分析网页 下载下面这个链接的销售数据 https://item.jd.com/6733026.html#comment 1.      翻页的时候,谷歌F12的Network页签可以看到下面 ...

  10. [BZOJ 2144]跳跳棋

    Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...