【牛客刷题-算法】NC34 不同路径的数目(一) | 动态规划、组合数解法

简介: 【牛客刷题-算法】NC34 不同路径的数目(一) | 动态规划、组合数解法

1.题目描述


描述

一个机器人在m×n大小的地图的左上角(起点)。

机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。

可以有多少种不同的路径从起点走到终点?

image.png


备注:m和n小于等于100,并保证计算结果在int范围内

数据范围:0 < n,m \le 1000<n,m≤100,保证计算结果在32位整型范围内

要求:空间复杂度 O(nm)O(nm),时间复杂度 O(nm)O(nm)

进阶:空间复杂度 O(1)O(1),时间复杂度 O(min(n,m))O(min(n,m))


2.算法设计思路与代码实现


思路一:动态规划,递归实现


只需明白一件事,因为机器人只能向右或向下走,那么我们要到达( m , n ) (m,n)(m,n)点,有两种方式:


从( m − 1 , n ) (m-1,n)(m−1,n)点向下走一步

从( m , n − 1 ) (m,n-1)(m,n−1)点向右走一步

则从起点到达( m , n ) (m,n)(m,n)点的路径数,就等于从起点到达( m − 1 , n ) (m-1,n)(m−1,n)的路径数与到达( m , n − 1 ) (m,n-1)(m,n−1)的路径数之和。


image.png

时间复杂度为o ( m + n ) o(m+n)o(m+n)


代码实现


int uniquePaths(int m, int n) {
        if(m == 1 || n == 1)
        {
            return 1;
        }
        return uniquePaths(m-1, n) + uniquePaths(m, n-1);
    }

思路二:组合数

image.png


image.png

代码实现


int uniquePaths(int m, int n) {
        int all = m + n -2;
        int min = m < n ? m : n;
        long long result = 1;
        for(int a = 1, b = min; b <= all; a++, b++){
            result = result * b / a;
        }
        return result;
    }

注意细节


代码中变量result的类型为long long,而题目中提到了路径数不会超过32位的int。那为什么要用long long?这其实也是一个常见的问题,虽然运算结果本身不会溢出,但是仍然需要小心运算过程中的中间结果发生溢出。


例如代码中,result = result * b / a;是先进行乘法运算然后进行除法运算的,可能在做乘法时就已经溢出了。


一个疑惑


代码可以通过牛客的测试集,但是我对循环中的这一语句感到疑惑:result = result * b / a;。它涉及到除法运算,如何保证不会出现不能整除的情况呢?然而在我有限的尝试中,它确实没出现问题。


3.运行结果


成功通过!

image.png


相关文章
|
2月前
|
存储 算法
深入了解动态规划算法
深入了解动态规划算法
58 1
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
18天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
32 2
|
2月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
69 2
动态规划算法学习三:0-1背包问题
|
2月前
|
数据采集 监控 安全
厂区地图导航制作:GIS技术与路径导航算法融合
在智能化、数字化时代,GIS技术为厂区的运营管理带来了革命性变化。本文探讨了如何利用GIS技术,通过数据采集、地图绘制、路径规划、位置定位和信息查询等功能,打造高效、精准的智能厂区地图导航系统,提升企业的竞争力和管理水平。
53 0
厂区地图导航制作:GIS技术与路径导航算法融合
|
2月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
68 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
2月前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
143 0
动态规划算法学习二:最长公共子序列
|
2月前
|
存储 人工智能 算法
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
|
2月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
110 0
|
2月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
16 0
下一篇
无影云桌面