• 83 不同路径 II(63)


    作者: Turbo时间限制: 1S章节: 动态规划

    晚于: 2020-09-02 12:00:00后提交分数乘系数50%

    截止日期: 2020-09-09 12:00:00

    问题描述 :

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

    现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

    网格中的障碍物和空位置分别用 1 和 0 来表示。

    说明:m 和 n 的值均不超过 100。

    示例 1:

    输入:

    [

      [0,0,0],

      [0,1,0],

      [0,0,0]

    ]

    输出: 2

    解释:

    3x3 网格的正中间有一个障碍物。

    从左上角到右下角一共有 2 条不同的路径:

    1. 向右 -> 向右 -> 向下 -> 向下

    2. 向下 -> 向下 -> 向右 -> 向右

    输入说明 :

    首先输入矩阵的行数m和列数n

    然后输入m行,每行n个字符0或1。中间无空格分隔。

    说明:m 和 n 的值均不超过 100。

    输出说明 :

    输出一个整数

    输入范例 :

    输出范例 :

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class Solution {
    public:
        int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
        {
            int m=obstacleGrid.size(),n=obstacleGrid[0].size();
            vector<vector<int>> dp(m,vector<int>(n,0));
            if(m==0||n==0)
            {
                return 0;
            }
           
            if(obstacleGrid[0][0]==1)
                return 0;
            else
                dp[0][0]=1;
            for(int i=1;i<m;i++)
            {
                if(obstacleGrid[i][0]==0)
                {
                    dp[i][0]=dp[i-1][0];
                }
            
            } 
            for(int j=1;j<n;j++)
            {
                if(obstacleGrid[0][j]==0)
                    dp[0][j]=dp[0][j-1];
            }
            for(int i=1;i<m;i++)
            {
                for(int j=1;j<n;j++)
                    if(obstacleGrid[i][j]==0)
                        dp[i][j]=dp[i-1][j]+dp[i][j-1];
            }
    
            return dp[m-1][n-1];
        }
    };
    int main()
    {
        int m, n;
        char data;
        vector<vector<int> > obstacleGrid;
        cin>>m>>n;
        for(int i=0; i<m; i++)
        {
            vector<int> row;
            for(int j=0; j<n; j++)
            {
                cin>>data;
                row.push_back(data-'0');
            }
            obstacleGrid.push_back(row);
        }
        int res=Solution().uniquePathsWithObstacles(obstacleGrid);
        cout<<res<<endl;
        return 0;
    }

     

  • 相关阅读:
    servlet中调用注入spring管理的dao(转)
    java枚举类(转)
    压缩包太大导致的部署问题
    oracle数据泵导出导入
    全错位排列
    母函数及相关的算法题
    Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
    Effective Modern C++翻译(4)-条款3:了解decltype
    Effective Modern C++翻译(3)-条款2:明白auto类型推导
    Effective Modern C++翻译(2)-条款1:明白模板类型推导
  • 原文地址:https://www.cnblogs.com/zmmm/p/13654826.html
Copyright © 2020-2023  润新知