[LeetCode63]Unique pathII动态规划解题示例
来源:互联网 发布:java rmi 框架 编辑:程序博客网 时间:2024/05/21 12:48
一、题目描述
给定一个网格,网格中的每一个方格分别用0和1表示,其中0表示该方格可以通过,1表示该方格有障碍物,无法通过。因此该网格可以用一个n*m的矩阵M表示,其中矩阵元素只包括1和0,求M[0][0]到M[n-1][m-1]有多少种不同的路径可以到达,每次移动只能向下或者向右移动。比如给定方格为以下方格矩阵,
[ [0,0,0], [0,1,0], [0,0,0]]则输出结果为2,代表从[0][0]到[2][2]通过向下移动以及向右移动一共有两种不同的路径可以到达。
二、思路解析
这道题主要用到动态规划的思想,动态规划的核心思想是将上一步所得到的输出结果当做下一步计算的输入。在本题中,我们需要计算出[0][0]到[n-1][m-1]一共有多少种路径,用f(M[n-1][m-1])表示,由于移动只能是向下移动或者向右移动,那么到达[n-1][m-1]之前所到达的方格只能是[n-2][m-1]或者[n-1][m-2]至两个,因此很容易得到f(M[n-1][m-1]) = f(M[n-2][m-1]) + f(M[n-1][m-2])。那么我们接下来只需要计算出f(M[n-2][m-1])和f(M[n-1][m-2])的值即可。同理,对于f(M[n-2][m-1]) 或者 f(M[n-1][m-2]),我们也可以用上诉思路进行计算。最终,对于每一个M[i][j]我们都可以得到一个f(M[i][j]),得到一个与矩阵M相等大小的矩阵F,输出F[n-1][m-1]即可。
计算矩阵F方法其实很简单,首先计算出F[0][j]和F[i][0]的值,即矩阵的第一行和第一列。对于第一行和第一列,若某M值为1,则其之前的F值全为1,之后全为0。接下来,对于每一个方格的f[i][j],都有f[i][j]=f[i-1][j]+f[i][j-1],若M值为1,则其对应F值为0,依次类推,直到得到矩阵F,输出F[n-1][m-1]即可。注意矩阵M的一些边界情况即可。
三、代码实现
class Solution {public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int m = obstacleGrid.size(); int n = obstacleGrid[0].size(); int i,j; if(m == n && m == 1) { if(obstacleGrid[0][0] == 1) return 0; else return 1; } vector<vector<int>> path(m,vector<int> (n,0)); for(i = 0; i < m; i++) { if(obstacleGrid[i][0] == 1) { break; } path[i][0] = 1; } for(i = 0; i < n; i++) { if(obstacleGrid[0][i] == 1) { break; } path[0][i] = 1; } for(i = 1; i < m; i++) { for(j = 1; j < n; j++) { if(obstacleGrid[i][j] == 1) continue; path[i][j] = path[i - 1][j] + path[i][j - 1]; } } return path[m - 1][n - 1]; }};
- [LeetCode63]Unique pathII动态规划解题示例
- LeetCode63:Unique Paths II
- Leetcode63 Unique Paths II
- LeetCode63. Unique Paths II
- leetcode63-Unique Paths II
- Leetcode63. Unique Paths II
- Leetcode63: Unique Paths II
- leetcode63. Unique Paths II
- leetcode63. Unique Paths II
- LeetCode63 Unique Paths II
- Leetcode解题笔记 62. Unique Paths [Medium] 动态规划
- Leetcode解题笔记 63. Unique Paths II [Medium] 动态规划
- leetcode63解题报告
- leetcode63.[DP] Unique Paths II
- 动态规划解题
- 动态规划解题法
- PAT1068 动态规划解题
- 动态规划解题入门
- 严重: A child containerfailed during start
- c++作业5
- ruby 类和对象
- Python 3基础教程33-tkinter模块创建一个window窗体
- C#将数据库的元组导出生产txt文件,代码实现
- [LeetCode63]Unique pathII动态规划解题示例
- 前端面试(二)
- Eclipse导入JSP报错The superclass "javax.servlet.http.HttpServlet" was not found on the Java
- 523. Continuous Subarray Sum
- Lintcode44 Minimum Subarray solution 题解
- 计算机技术英语词汇总结·二十
- OpenCV+Tesseract进行OCR学习(一)文字提取
- 170507 汇编-直接定址表,反编译-算法分析
- redis持久化RDB和AOF