zoukankan      html  css  js  c++  java
  • 62. 不同路径

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

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

      问总共有多少条不同的路径?

       

      例如,上图是一个7 x 3 的网格。有多少可能的路径?

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

      示例 1:

        输入: m = 3, n = 2
        输出: 3
      解释:
      从左上角开始,总共有 3 条路径可以到达右下角。
        1. 向右 -> 向右 -> 向下
        2. 向右 -> 向下 -> 向右
        3. 向下 -> 向右 -> 向右
      示例 2:

        输入: m = 7, n = 3
         输出: 28

    思路一:排列组合

    因为机器到底右下角,向下几步,向右几步都是固定的,

    比如,m=3, n=2,我们只要向下 1 步,向右 2 步就一定能到达终点。

    所以有 C_{m+n-2}^{m-1}C

    思路二:动态规划

    我们令 dp[i][j] 是到达 i, j 最多路径

    动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]

    注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1

    时间复杂度:O(m*n)O(m∗n)

    空间复杂度:O(m * n)O(m∗n)

    优化:因为我们每次只需要 dp[i-1][j],dp[i][j-1]

    (1):

    package array;
    
    import java.util.Arrays;
    
    public class L62_2 {
        public static int uniquePaths(int m, int n) {
              int[] cur = new int[n];
                Arrays.fill(cur,1);
                for (int i = 1; i < m;i++){
                    for (int j = 1; j < n; j++){
                      cur[j] += cur[j-1] ;
                    }
                }
                return cur[n-1];
        }
        public static void main(String[] args) {
            System.out.println(uniquePaths(51,9));
        }
    }

    (2):

    package array;
    
    public class L62_1 {
        public static int uniquePaths(int m, int n) {
            int[][] ma = new int[m][n];
            for(int indexm = 0;indexm < m;indexm++){
                for (int indexn = 0;indexn < n;indexn++){
                    if(indexm == 0 || indexn == 0){
                        ma[indexm][indexn] = 1;
                    }else{
                        ma[indexm][indexn] = ma[indexm][indexn-1] + ma[indexm-1][indexn];
                    }
                }
            }
            return ma[m-1][n-1];
        }
    
        public static void main(String[] args) {
            System.out.println(uniquePaths(51,9));
        }
    
    }
  • 相关阅读:
    蝶恋花
    JVM解毒——JVM与Java体系结构
    超赞!IDEA 最新版本,支持免打扰和轻量模式!
    SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存
    神奇的 SQL 之 WHERE 条件的提取与应用
    终于放弃了单调的swagger-ui了,选择了这款神器—knife4j
    Git 高级用法,喜欢就拿去用
    既然有 HTTP 请求,为什么还要用 RPC 调用?
    SpringBoot和Spring到底有没有本质的不同?
    一条简单的更新语句,MySQL是如何加锁的?
  • 原文地址:https://www.cnblogs.com/mayang2465/p/11742763.html
Copyright © 2011-2022 走看看