首页 > 其他分享 >62. 不同路径

62. 不同路径

时间:2024-11-10 22:11:05浏览次数:1  
标签:return int 不同 路径 long process 62 ans dp

  1. 题目链接

  2. 解题思路

    • 方法一:暴力递归,process(i, j),当前在[i, j]位置,到达右下角有多少种方法?

      • 如果i < m - 1,那么可以往下走,所以结果加process(i + 1, j)

      • 如果j < n - 1,那么可以往右走,所以结果加process(i, j + 1)

      • 因为只有两个可变参数,所以直接加缓存即可。

      • 代码

        class Solution {
        public:
            int process(const int m, const int n, int i, int j, vector<vector<int>> &dp) {
                if (i == m - 1 && j == n - 1) {    // 到达右下角了  答案+1
                    return 1;
                }
                if (dp[i][j] != -1) {
                    return dp[i][j];
                }
                int ans = 0;
                if (i < m - 1) {    // 没有到达最后一行 可以往下走
                    ans += process(m, n, i + 1, j, dp);
                }
                if (j < n - 1) {    // 没有到达最后一列,可以往右走
                    ans += process(m, n, i, j + 1, dp);
                }
                dp[i][j] = ans;
                return ans;
            }
            int uniquePaths(int m, int n) {
                vector<vector<int>> dp(m, vector<int>(n, -1));
                return process(m, n, 0, 0, dp);
            }
        };
        
    • 方法二:其实就是一个数学题,从左上角,到右下角,一共有n + m - 2步,所以就是n + m - 2步中,拿出n - 1步往右走C(n - 1, n + m - 2)

      • 代码
        class Solution {
        public:
        
            // 用longlong防止溢出
            long long process(int a, int n) {     // 计算C(a, n)
            if (a == 0) {
                return 1;
            } 
                long long ans = 1;
                for (int i = 1; i <= a; ++i) {
                    ans = ans * (n - i + 1) / i;
                }
                return ans;
            }
        
            int uniquePaths(int m, int n) {
                if (m < n) {   // 谁小算谁
                    return process(m - 1, n + m - 2);
                }
                return  process(n - 1, n + m - 2);
            }
        };
        

标签:return,int,不同,路径,long,process,62,ans,dp
From: https://www.cnblogs.com/ouyangxx/p/18538622

相关文章

  • 小北的字节跳动青训营与LangChain实战课:深入探索Chain的奥秘(上)写一篇完美鲜花推文?用Se
     前言    最近,字节跳动的青训营再次扬帆起航,作为第二次参与其中的小北,深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮,更是一个连接未来与梦想的桥梁~小北的青训营XMarsCode技术训练营——AI加码,字节跳......
  • P3628 [APIO2010] 特别行动队
    原题链接byd的题敢卡李超线段树!!望周知!!......
  • SQL,力扣题目262,行程和用户
    一、力扣链接LeetCode_262二、题目描述表:Trips+-------------+----------+|ColumnName|Type|+-------------+----------+|id|int||client_id|int||driver_id|int||city_id|int||status|enum......
  • %windir% 是一个环境变量,它指向当前操作系统中 Windows 安装目录的路径。它常用于批处
    %windir%是一个环境变量,它指向当前操作系统中Windows安装目录的路径。它常用于批处理文件、命令行或者脚本中,帮助系统或用户快速定位Windows系统文件夹的路径。类似的环境变量还有很多,它们通常用于在操作系统中快速访问重要的文件夹和目录,避免硬编码路径,从而提高脚本的可移植......
  • 【python】路径与文件管理:pathlib库的现代用法
    【Python】路径与文件管理:pathlib库的现代用法在日常的Python开发中,文件和路径管理是一个常见的任务。无论是读取文件,创建目录,还是获取文件属性,都涉及到路径操作。在Python的早期版本中,我们使用os和os.path模块来处理路径,但这些方法往往显得冗长且不够直观。为了......
  • 尽管语言都是 C++,由于平台和编译器的不同,API 的实现和使用方式也有所不同,导致出现了很
    确实,尽管语言都是C++,由于平台和编译器的不同,API的实现和使用方式也有所不同,导致出现了很多“变种”。以下是一些常见的原因和应对方法:1.平台差异Windows使用WinAPI,它是Windows系统特有的一组API,许多Windows特定的操作(如窗口管理、文件操作、进程管理)都依赖于Wi......
  • 最短路径算法综述:原理、比较与实现
    最短路径算法综述:原理、比较与实现一、引言在图论和计算机科学领域,最短路径问题是一个经典且重要的研究内容。它在交通导航、网络路由、物流规划等众多实际应用场景中有着广泛的应用。本文将详细介绍几种常见的最短路径算法,包括Dijkstra算法、Bellman-Ford算法、Floy......
  • 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS
    因为C++具有跨平台的特性,所以有些需求一套代码就多端使用,比如我最近在学习的OpenGLES。但是,不同平台还是具有一定差异性,所以我们首先得判断出是什么平台?比如iOS系统和Android系统。那么如何判断呢?我们接着往下看!要检查C或C代码中主机的操作系统,我们需要检查编......
  • 路径上若干条树的包含
    题意别人今天期中考,而你依然在机房里为今年的NOIP努力刷题。一道两道三四道,紫题黑题不会题。暴力枚举TLE,数组开小爆零寄……已过立冬,窗外寒风瑟瑟,但是你看到有一棵树屹立不倒,你也想成为像大树一般挺拔的人。一、二、三……你仔细数着,发现树上有\(n\)个结点。忽然你手里......
  • 力扣(Leetcode)112. 路径总和(JAVA)
    一、目标 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。二、代码解读......