力扣(LeetCode)试题62-不同路径 C++代码

题目描述:

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

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

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

解法一:递归(超过时间限制,通过用例41 / 62 个

步骤一:递推公式:uniquePaths(m,n) = uniquePaths(m-1,n)+uniquePaths(m,n-1)

步骤二:返回条件:if(m==0 || n==0) return 0;  if(m==1 || n==1) return 1;

代码:

class Solution {
public:
    int uniquePaths(int m, int n) 
    {
        if(m==0 || n==0) return 0;
        if(m==1 || n==1) return 1;
        return uniquePaths(m, n-1) + uniquePaths(m-1, n);
    }
};

解法二:动态规划

步骤一:递推公式(状态转移方程):Finish[i][j] = Finish[i][j - 1] + Finish[i - 1][j]

步骤二:缓存复用:

for (int i = 0; i<m; i++)
        {
            for (int j = 0; j<n; j++)
            {
                if (i == 0 || j == 0) Finish[i][j] = 1;
                else Finish[i][j] = Finish[i][j - 1] + Finish[i - 1][j];
            }
        }

代码:

class Solution {
public:
    int uniquePaths(int m, int n)
    {
        vector< vector<int> > Finish(m, vector<int>(n));
        for (int i = 0; i<m; i++)
        {
            for (int j = 0; j<n; j++)
            {
                if (i == 0 || j == 0) Finish[i][j] = 1;
                else Finish[i][j] = Finish[i][j - 1] + Finish[i - 1][j];
            }
        }
        return Finish[m - 1][n - 1];
    }
};

 

 

posted @ 2020-09-07 09:45  ZyLin-ux  阅读(171)  评论(0编辑  收藏  举报