今日学会一到DP题

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

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

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

示例 1:

输入:m = 3, n = 7
输出:28
示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  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这方面自己真的太菜了,得好好学一学。

posted @ 2021-12-18 00:13  博客是个啥?  阅读(19)  评论(0编辑  收藏  举报