zoukankan      html  css  js  c++  java
  • 11/7 <Dynamic Programming>

    62. Unique Paths

    方法一: 二位数组

    而这道题是每次可以向下走或者向右走,求到达最右下角的所有不同走法的个数。那么跟爬梯子问题一样,需要用动态规划 Dynamic Programming 来解,可以维护一个二维数组 dp,其中 dp[i][j] 表示到当前位置不同的走法的个数,然后可以得到状态转移方程为:  dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

    class Solution {
        public int uniquePaths(int m, int n) {
            int[][] result = new int[m][n];
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    if(i == 0 || j == 0)    
                        result[i][j] = 1; 
                    else
                        result[i][j] = result[i - 1][j] + result[i][j - 1];
                }
            }
            return result[m - 1][n - 1];
        }
    }

    方法二:

    为了节省空间,实际上我们只需要记录遍历到(i, j)这个位置的时候当前行有几种路径,如果遍历到(i, m-1)的时候,替换掉这一行对应列的路径即可,于是状态转移方程编程:
    dp[j] = dp[j] + dp[j-1]

    class Solution {
        public int uniquePaths(int m, int n) {
            int[] dp = new int[n];
            dp[0] = 1;
            for(int i = 0; i < m; i++){
                for(int j = 1; j < n; j++){
                    dp[j] += dp[j-1];
                }
            }
            return dp[n-1];
        }
    }

    63. Unique Paths II

    如果有障碍,则dp[j] = 0;

    class Solution {
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            int width = obstacleGrid[0].length;
            int[] dp = new int[width];
            dp[0] = 1;
            for(int[] row : obstacleGrid){
                for(int j = 0; j < width; j++){
                    if(row[j] == 1)
                        dp[j] = 0;
                    else if(j > 0)
                        dp[j] += dp[j - 1];
                }
            }
            return dp[width - 1];
        }
    }
  • 相关阅读:
    vue-路由传参
    ES6模板字符串
    es6中Set和Map数据结构
    本周面试题
    var、let和const定义变量的特点
    修改this的指向
    Echarts图表插件
    ES6学习
    swiper插件学习
    每日刷题4
  • 原文地址:https://www.cnblogs.com/Afei-1123/p/11816125.html
Copyright © 2011-2022 走看看