目录
一、题目
这道题目出自于牛客网的一道题目。原题如下:
描述
一个机器人在m×n大小的地图的左上角(起点)。
机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。
可以有多少种不同的路径从起点走到终点?
备注:m和n小于等于100,并保证计算结果在int范围内
数据范围:0<n,m≤100,保证计算结果在32位整型范围内
要求:空间复杂度O(nm),时间复杂度 O(nm)
进阶:空间复杂度 O(1),时间复杂度O(min(n,m))
二、解题思路
我们首先知道了动态规划是存放上一次计算数据,使得下一次计算的时候用上上一次的计算数据,节省了计算机的计算时间。提高运行的速度。
这里的我们选这个从左往右再从上而下,每一个格子分别存放到该格子的路径数目。
每当有一个新格子要计算它的路径数目的时候,用它的左边那个格子的数目加上它上面那个格子的数目,就为当前要求那个格子的数目。当然了,这里有特殊情况,当第一行和第一列的时候数目都为1,并且左上角的第一个格子的数目为1。如下表格(4X5):
1 | 1 | 1 | 1 | 1 |
1 | ||||
1 | ||||
1 |
当这些已知条件整理清楚的时候,就可以写代码了。
三、代码
代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {
//使用vector声明一个二维数组,当然可以用int F[n][m]
vector<vector<int>> F(n, vector<int>(m, -1));
F[0][0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (i == 0 && j == 0) {
//为左上角第一个格子的时候为1
F[i][j] = 1;
}
else if (i == 0 || j == 0) {
//第一行或者是第一列的时候为1
F[i][j] = 1;
}
else {
//新格子的数目计算
F[i][j] = F[i - 1][j] + F[i][j - 1];
}
}
}
//返回需要求的的位置的路径数目
return F[n - 1][m - 1];
}
};
四、结束
对于写代码做算法,我相信只要肯花时间都是能弄会的。加油奋斗者!