zoukankan      html  css  js  c++  java
  • 【LeetCode & 剑指offer刷题】动态规划与贪婪法题9:Unique Paths(系列)

    【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

    Unique Paths(系列)

    Unique Paths
    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).
    The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).
    How many possible unique paths are there?
    Above is a 7 x 3 grid. How many possible unique paths are there?
    Note: m and n will be at most 100.
    Example 1:
    Input: m = 3, n = 2
    Output: 3
    Explanation:
    From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
    1. Right -> Right -> Down
    2. Right -> Down -> Right
    3. Down -> Right -> Right
    Example 2:
    Input: m = 7, n = 3
    Output: 28

    C++
     
    //问题:街区路径问题(与LCS最长公共子序列问题类似) 求机器人从起点到终点的路径数量
    //方法一:设P[i][j] 为到坐标(i,j)的路径总数,则由于机器人只能向右或者向下,故有P[i][j] = P[i - 1][j] + P[i][j - 1]
    //O(n^2) O(m*n)
    class Solution
    {
    public:
        int uniquePaths(int m, int n)
        {
            vector<vector<int>> path(m, vector<int>(n, 1)); //(1,0)和(0,1)处初始化为1
          
            for(int i = 1; i<m; i++) //i从1开始,扫描行
                for(int j =1; j<n; j++) //扫描列
                    path[i][j] = path[i-1][j] + path[i][j-1];
          
            return path[m-1][n-1];
        }
    };
    /*
    * 方法一改进
      用一个列向量存当前需要的元素即可,将空间复杂度优化至O(min(m,n))
    * 例子
        1 1 1 1  1  1
        1 2 3 4  5  6
        1 3 6 10 15 21
    dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
    dp[i][j],dp[i-1][j] ---> dp[j]
    dp[i][j-1] ---> dp[j-1]
    */
    class Solution
    {
    public:
        int uniquePaths(int m, int n)
        {
            vector<int> dp(n, 1); //进一步改进可以选择min(m,n)
           
            for (int i = 1; i < m; ++i) //扫描行
            {
                for (int j = 1; j < n; ++j) //扫描列
                {
                    dp[j] += dp[j - 1];
                }
            }
            return dp[n - 1];
        }
    };
     
    63. Unique Paths II
    Now consider if some obstacles are added to the grids. How many unique paths would there be?
    An obstacle and empty space is marked as 1 and 0 respectively in the grid.
    Note: m and n will be at most 100.
    Example 1:
    Input:
    [
    [0,0,0],
    [0,1,0],
    [0,0,0]
    ]
    Output: 2
    Explanation:
    There is one obstacle in the middle of the 3x3 grid above.
    There are two ways to reach the bottom-right corner:
    1. Right -> Right -> Down -> Down
    2. Down -> Down -> Right -> Right

     
    /*
    问题:有障碍物的栅格中,机器人从起始点到终点的路径数量
    方法:动态规划
    对于有障碍物的栅格中,dp值置0
    */
    class Solution
    {
    public:
        int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
        {
            if (obstacleGrid.empty() || obstacleGrid[0].empty() || obstacleGrid[0][0] == 1)
                return 0; //矩阵为空或者起始点为障碍点时,退出
           
            int m = obstacleGrid.size();
            int n = obstacleGrid[0].size();
            vector<vector<int>> dp(m, vector<int>(n)); //初始化为0
           
            for (int i = 0; i < m; i++) //从0开始扫描,因为任何点都有可能为障碍点(如(0,1)和(1,0))
            {
                for (int j = 0; j < n; j++)
                {
                    if (obstacleGrid[i][j] == 1) dp[i][j] = 0; //有障碍的地方dp值置0
                    else if (i == 0 && j == 0) dp[i][j] = 1;   //起始点到起始点路径数为1(若无障碍)
                    else if (i == 0 && j > 0) dp[i][j] = dp[i][j - 1]; //第一行的处理
                    else if (i > 0 && j == 0) dp[i][j] = dp[i - 1][j]; //第一列的处理
                    else dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; //其他情况的处理
                }
            }
            return dp.back().back(); //返回末尾点
        }
    };
     
  • 相关阅读:
    初认识AngularJS
    (imcomplete) UVa 10127 Ones
    UVa 10061 How many zero's and how many digits?
    UVa 11728 Alternate Task
    UVa 11490 Just Another Problem
    UVa 10673 Play with Floor and Ceil
    JSON对象和字符串的收发(JS客户端用typeof()进行判断非常重要)
    HTML.ActionLink 和 Url.Action 的区别
    EASYUI TREE得到当前节点数据的GETDATA方法
    jqueery easyui tree把已选中的节点数据拼成json或者数组(非常重要)
  • 原文地址:https://www.cnblogs.com/wikiwen/p/10229355.html
Copyright © 2011-2022 走看看