63. Unique Paths II(中等, 能独立做出来的DP类第二个题^^)
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 的处理上.下面是方法:
核心思路:
- 先搞定第 0 行和第 0 列;
- 第 0 行和第 0 列若有障碍, 则该处及后面的都 = 0;
- 非0行、列,则按公式填写 bp matrix, 从 row=1, col=1开始. 若遇 obstacle, 该处设置为0.
注意处理 special case:if(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];
}
随机推荐
- Angular 学习笔记 ( PWA + App Shell )
PWA (Progressive Web Apps) 是未来网页设计的方向. 渐进式网站. Angular v5 开始支持 pwa 网站 (所谓支持意思是说有一些 build in 的方法和规范去实现 ...
- 新概念英语(1-32)A fine day
新概念英语(1-33)A fine day Where is the Jones family? It is a fine day today. There are some clouds in th ...
- ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查
身份验证 以前我们熟悉的web.config中配置的form验证,现在没有了.我们来看看在Core里面如何配置: 首先需要NuGet安装一个包:Microsoft.AspNetCore.Authent ...
- win7远程桌面 连接不上(用户名与全名不匹配的问题)
用户名与用户全名不一致导致的.我刚也是这个问题,折腾够了好久.你先看看 计算机右键→管理→本地用户和组→用户 找到你需要远程的管理员账户,看看名称与全名是否一致,若不一致,继续看下面.1.按" ...
- (第一章)对程序员来说CPU是什么
这几天,看到一本书,<程序是怎么跑起来的>,觉得之前都没有完整的看完一本书,现在要从这本书开始,慢慢的培养自己写读书笔记的习惯,不能度过去就忘了. 学习是一个螺旋上升的过程,不要指望一下子 ...
- 基于session认证 相亲小作业
基于session认证 相亲小作业 用户登录 如果男用户登录,显示女生列表 如果女用户登录,显示男生列表 urls ===========================urls========== ...
- 高下相倾,前后相随——iterator 与 for ... of 循环
iterator 是es6新提供的一种遍历器.本质上是一个接口,为各种不同的数据结构,提供统一的访问机制. 数据只要部署了iterator接口,便是可遍历的数据,标志是具有Symbol.iterato ...
- POJ-2263 Heavy Cargo---最短路变形&&最小边的最大值
题目链接: https://vjudge.net/problem/POJ-2263 题目大意: 有n个城市,m条连接两个城市的道路,每条道路有自己的最大复载量.现在问从城市a到城市b,车上的最大载重能 ...
- Python系列之 - multiprocessing
由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程. multiprocessing包是Python中的多进程 ...
- C# GetValue 正则获取开始结束代码
/// <summary> /// 获得字符串中开始和结束字符串中间得值 /// </summary> /// <param name="str"&g ...