当前位置: 首页 > news >正文

不同路径I

LCR 098. 不同路径 - 力扣(LeetCode)

题目描述:

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

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

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

 

拿示例一举例,已知机器人每次只能向右边或者向下边移动一步。

若将整个网格看做一个二维数组dp[n][m],则☆处的位置为dp[i][j],故可得方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]。

如果直接使用dp[i][j]=dp[i-1][j]+dp[i][j-1]的话会导致越界问题,例如如上图当i=0,j=0时,方程就变成了dp[0][0]=dp[-1][0]+dp[0][-1],导致了越界。因此我们需要进行边界处理。

第一种

我们可以发现机器人从起点开始一直沿着右边或者一直沿着下边走,无论走到哪个格子都只有一种路径,因此我们可以直接提前将dp[0][j]和dp[i][0]都设置为1。如果终点不在第一行第一列的话直接从dp[1][1]开始遍历计算求解。

如图所示:

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,0));
        if(m==1||n==1)
        {
            return 1;
        }
        else
        {
            for(int j=0,i=0;i<m;i++)//列
            {
                dp[i][j]=1;
            }
            for(int i=0,j=0;i<n;i++)//行
            {
                dp[j][i]=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-1][n-1];
        }  
    }
};

第二种

我们可以根据所得方程dp[i][j]=dp[i-1][j]+dp[i][j-1],在上边缘和左边缘新开辟一行一列,让这新开辟的一行一列辅助dp数组去进行初始化边缘。这就需要我们对多余开辟的数组空间进行相应初始化。如图所示:

根据方程可以简单看做终点处路径数量等于终点的上面一个格子与终点的左边一个格子的路径和。故只需要将机器人头上的格子设为1(或者将机器人左边的格子设为1),空白处为0。即可满足题意。

代码:

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        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];
    }
};

http://www.dtcms.com/a/112540.html

相关文章:

  • 洛谷题单3-P1720 月落乌啼算钱(斐波那契数列)-python-流程图重构
  • 迪杰斯特拉+二分+优先队列+拓扑+堆优化(奶牛航线Cowroute、架设电话线dd、路障Roadblocks、奶牛交通Traffic)
  • Leetcode 437 -- dfs | 前缀和
  • 大数据概念介绍
  • 高可用完全分布式集群启动命令
  • 基于 Java 的异步任务管理器的设计与实现方案
  • Currying柯里化
  • 【教程】Windows下 Xshell 连接跳板机和开发机
  • 基于PI控制和卡尔曼滤波的光通信相位偏差估计和补偿算法matlab仿真
  • 前端快速入门学习1——使用工具
  • [ISP 3A ] AE的常用算法分析
  • chown和chmod的区别
  • 使用内存数据库来为mapper层的接口编写单元测试
  • AI大模型时代前后端技术演进:MCP神经中枢架构下的技术栈抉择
  • Java项目之基于ssm的教务信息平台的设计与实现
  • 算法思想之双指针(一)
  • 深度学习处理文本(11)
  • Prolog语言的移动UI设计
  • COBOL语言的数据库交互
  • Pascal语言的设备管理
  • 【含文档+PPT+源码】基于SpringBoot+vue的疫苗接种系统的设计与实现
  • Scala学习总结③
  • JavaScript事件循环深度解析:从一道面试题看微任务与宏任务调度机制
  • 详细说明Qt 中共享内存方法: QSharedMemory 对象
  • 59.基于ssm和vue学生考试成绩管理系统
  • HTML快速上手
  • 如何在 GitHub 上开源一个小项目:从创建到长期维护的完整指南
  • 关键业务数据如何保持一致?主数据管理的最佳实践!
  • 出现次数超过一半的数(信息学奥赛一本通-1186)
  • 已经使用中的clickhouse更改数据目录