您的位置:首页 > 新闻 > 资讯 > 北京网站优化企业_公司简单网站多少钱_湘潭网站seo_网络营销的特点不包括

北京网站优化企业_公司简单网站多少钱_湘潭网站seo_网络营销的特点不包括

2025/4/18 17:29:47 来源:https://blog.csdn.net/m0_63703622/article/details/146995104  浏览:    关键词:北京网站优化企业_公司简单网站多少钱_湘潭网站seo_网络营销的特点不包括
北京网站优化企业_公司简单网站多少钱_湘潭网站seo_网络营销的特点不包括

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];}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com