[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];    }};


0 0
原创粉丝点击