「这是我参与2022首次更文挑战的第36天,活动详情查看:2022首次更文挑战」
一、问题描述
一个机器人位于一个
m x n **网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
题目链接:机器人走迷宫
二、题目要求
考察
1.动态规划中等题型
2.建议用时5~15min
数据要求
1 <= m, n <= 100- 题目数据保证答案小于等于
2 * 109
样例
m=3,n=7 输出28
m=3,n=2 输出3
m=3,n=3 输出6
三、问题分析
这也是一道比较典型的动态规划问题,动态规划没做过的可以看这一篇入门:
还是用我们的三步走老套路:
第一步含义搞懂:
这是二维数组,要求出不同路径,那么就用二维数组 dp[i][j]存储不同的路径个数。
第二步变量初始:
dp[1][1]=1 原地踏步不就是吗?
一步步写太多了,不想写了,我放一个编译结果图片,偷懒一下。
周围一圈都是初始化0
第三步规律归纳:
看看上面的图片有什么特别的地方,有时间可以自己动手写一下,印象会更加深刻,当时我就写了一遍。
是不是当前数组位置的到数 = 左面的数字 + 上面的数字啊!
所以dp[m][n]=dp[m][n-1]+dp[m-1][n];
三步走,打完收工!
四、编码实现
#include<iostream>
using namespace std;
int uniquePaths(int m, int n)
{
int i,j,dp[102][102]={0};//初始化变量
for(i=1;i<=m;i++)//循环判断
{
for(j=1;j<=n;j++)
{
if(i==1&&j==1)
{
dp[1][1]=1;//初始化变量
}
else
dp[i][j]=dp[i][j-1]+dp[i-1][j];//规律归纳
}
}
// for(i=0;i<=m;i++)//输出当前数组元素的值
// {
// for(j=0;j<=n;j++)
// {
// cout<<dp[i][j]<<" ";
// }cout<<"\n";
// }
return dp[m][n];//返回结果
}
int main()
{
int m,n;
cin>>m>>n;//输入数组大小
cout<<uniquePaths(m, n) ;//赋值给动态规划功能的函数
return 0;
}
五、测试结果
输入3 7: