[LeetCode]Unique Paths
Posted 我们都曾拥有最美的时光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]Unique Paths相关的知识,希望对你有一定的参考价值。
题目链接
题目内容
A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
How many possible unique paths are there?
Note: m and n will be at most 100.
题目解法
这道题目一个直接的想法是回溯法,但是当输入规模足够大时,会由于没有足够的剪枝条件而超时,为了解决这个问题,必须减少递归次数,通过动态规划可以实现用较少的递归次数来完成求解。
动态规划算法维护一个mat[m][n]
数组,设左上角为坐标原点,向右为x,向下为y,mat[x-1][y-1]
代表当位于(x,y)位置时的走法数,要走到(x,y),可以从(x-1,y)或者(x,y-1)走来,也就是说(x,y)位置的走法数等于(x-1,y)的走法数与(x,y-1)走法数的和,即mat[m][n]=mat[m-1][n]+mat[m][n-1]
。
使用动态规划能减少递归次数的关键在于mat数组,由于可能在多个递归中用到(x,y)点的走法数,在第一次计算出mat[x-1][y-1]
的值时存起来,以后再使用时直接从数组中取出,避免重复的递归,具体实现如下。
class Solution
private:
int findUniquePath(int m, int n, int **mat)
if (m <= 0 || n <= 0)
return 0;
if (m == 1 && n == 1)
return 1;
if (mat[m - 1][n - 1] > 0)
return mat[m - 1][n - 1];
else
mat[m - 1][n - 1] = findUniquePath(m - 1, n, mat) + findUniquePath(m, n - 1, mat);
return mat[m - 1][n - 1];
public:
int uniquePaths(int m, int n)
int **mat = (int **)malloc(sizeof(int *) * m);
for(int i = 0; i < m; i++)
mat[i] = (int *)malloc(sizeof(int) * n);
memset(mat[i], 0, sizeof(int) * n);
return findUniquePath(m, n, mat);
;
以上是关于[LeetCode]Unique Paths的主要内容,如果未能解决你的问题,请参考以下文章