今日学会一到DP题
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
作者:宫水三叶
链接:https://leetcode-cn.com/leetbook/read/path-problems-in-dynamic-programming/rtwu06/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这道题,是一道动态规划题,求解动态规划, 要找出本题状态的定义,然后确定状态如何转移。
思路:
定义f[i] [j]为机器人到达(i,j)坐标的路径数。那f[0] [0]=1
当机器人不在最上面或者最左边时,f[i] [j] = f[i-1] [j]+f[i] [j-1]
当机器人在最上面或者最左边时,都为1.
所以我们可以建一个二维数组,将首行,首列初始化,然后循环出我们要求的f[n-1] [n-1]
一种更省空间的作法是,用一个向量v,先初始化为全1,然后v[i]=v[i-1]+v[i] 不断去更新这个向量,到最后返回这个向量的最后一个值。
class Solution {
public:
int uniquePaths(int m, int n) {
vector<int>v(n,1);
for(int i=0;i<m-1;i++){
for(int j=1;j<n;j++){
v[j]=v[j-1]+v[j];
}
}
return v[n-1];
}
};
DP这方面自己真的太菜了,得好好学一学。