【动态规划专栏】专题二:路径问题--------1.不同路径

简介: 【动态规划专栏】专题二:路径问题--------1.不同路径


题目来源

本题来源为:

Leetcode62. 不同路径

题目描述

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

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

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

题目解析

我们可以模拟一下机器人的过程:

算法原理

1.状态表示

经验+题目要求

对于本题而言就是:

dp[i][j]表示:走到[i,j]位置的时候,一共有多少种方式。

2.状态转移方程

机器人到达[i,j]位置有两种,一种从上面过来,一种从左边过来。

根据最近的一步划分问题:

因此状态方程为:

dp[i][j]=dp[i-1][j]+dp[i][j-1]

3.初始化

初始化之前先看一下会有什么位置会发生越界访问:

因为机器人要么从上边下来,要门从左边下来,因此会发生越界的为第一排和第一列。

我们基本上会采取以下的初始化方式,在原二维数组的基础上加一行一列。

加上之后要注意两点:

下标映射注意新表与原始的下标关系即可,而虚拟节点里面的值要根据情况而定:

观察一下,第二行从第三个开始需要它上面的和左面的两个一起决定,而且要保证它上面的也就是虚拟节点不能被选上(也就是不影响结果)那么它应该就是负无穷,但是本题的范围:

所以我们赋值为0就不会被选上了。依次内推:

因为第二排的第二个位置会决定其他位置的值,因此要赋值为1;这里有两种,可以从上面虚拟节点也可以从左面的虚拟节点进行赋值。

4.填表顺序

整体从上往下,每排从左往右。

5.返回值

根据题目要求,需要返回右下角的值,因此返回:

dp[m][n]

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:
    int uniquePaths(int m, int n) 
    {
            // 1.创建dp表
            // 2.初始化
            // 3.填表
            // 4.返回值
            vector<vector<int>> dp(m+1,vector<int>(n+1));
            dp[0][1]=1;
            //从上往下遍历
            for(int i=1;i<=m;i++)
            {
                //从左往右遍历
                for(int j=1;j<=n;j++)
                {
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
                }
            }
            return dp[m][n];
    }
};

时间复杂度:O(MN)
空间复杂度:O(M
N)

相关文章
|
安全 编译器 C++
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
【C/C++ 类型转换规则】一文了解C/C++ 中的类型转换规则,帮助你更好的编程
497 0
|
人工智能 Apache
社区供稿 | 140B参数、可商用!OpenBuddy 发布首个开源千亿中文 MoE 模型的早期预览版
我们很自豪地于今天发布OpenBuddy最新一代千亿MoE大模型的早期预览版本:OpenBuddy-Mixtral-22Bx8-preview0-65k。此次发布的早期预览版对应约50%的训练进度。
|
安全 网络性能优化 Android开发
深入解析:选择最佳C++ MQTT库的综合指南
深入解析:选择最佳C++ MQTT库的综合指南
1750 0
|
算法
基于EM算法的参数辨识和分类识别算法matlab仿真
基于EM算法的参数辨识和分类识别算法matlab仿真
322 0
基于EM算法的参数辨识和分类识别算法matlab仿真
|
机器人 Python
Python利用动态规划解决路径选择问题
Python利用动态规划解决路径选择问题
209 0
|
机器学习/深度学习 人工智能 算法
ICLR 2022 Spotlight|让AI学会捏橡皮泥飞机
ICLR 2022 Spotlight|让AI学会捏橡皮泥飞机
156 0
|
NoSQL Redis 数据库
一步一步学习Redis——连接服务的相关命令
一步一步学习Redis——连接服务的相关命令
一步一步学习Redis——连接服务的相关命令
|
Java Python
ACM 选手图解 LeetCode 之两个数组的交集
ACM 选手图解 LeetCode 之两个数组的交集
ACM 选手图解 LeetCode 之两个数组的交集
|
弹性计算 运维 Kubernetes
边开飞机边换引擎?我们造了个新功能保障业务流量无损迁移
容器化部署应用可以降低企业成本,提升研发效率,解放运维人员。据 Gartner 预计,到 2022 年,将有 75% 的企业将在生产中运行容器化应用程序。Kubernetes 是企业部署容器化应用的首选框架。由于 Kubernetes 部署及运维的复杂性,越来越多的客户选择将业务从 ECS 或者自建的 Kubernetes 迁移到阿里云托管版 Kubernetes —— ACK 中。但是,如何保证业务流量的平滑迁移成为一大挑战。
边开飞机边换引擎?我们造了个新功能保障业务流量无损迁移