[LeetCode]Unique Paths

题目链接

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?

Robot

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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值