算法题——Unique Paths(C++)动态规划

题目描述:
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?
《算法题——Unique Paths(C++)动态规划》

读题:
从左上角到右下角,每次只能向下或者向右走一步,有多少种走法。

知识储备:
动态规划

解题思路:
因为每次只能向下或者向右走一步,要走到第(x,y)个格子,相当于(x-1,y)的走法加上(x,y-1)的走法。

将问题分解成子问题之后,可以用递归解决。
将每个格子的走法数量保存起来,就可以用动态规划的方法了。

《算法题——Unique Paths(C++)动态规划》

用1个数组dpTable保存每一格的路径数量。初始化为0,将dpTable[1][1]初始化为1。(1,1)为出发格子。而x=0及y=0的数组只是辅助作用,并不会真的走到这个格子。

走到某一格,有几种情况,
1:如果该格本身已经有保存数量了(之前已经走过了),那么直接返回数组里的数据。
2:dpTable[x][y]= dpTable[x-1][y]+ dpTable[x][y-1]
3:如果走在边界的格子,即x=1或者y=1的边界,因为(0,y)或者(x,0)并不会真的走到,dpTable[x-1][y]或 dpTable[x][y-1]直接返回0。

提交代码:

class Solution {
public:
    int uniquePaths(int m, int n) {
        int dpTable[101][101] = {0};
        dpTable[1][1] = 1;   //起点
        return dp(dpTable, m, n, m, n);
    }
    int dp(int dpTable[101][101], int m, int n, int x, int y){

        if (x == 1 && y == 1) {
            return dpTable[x][y];
        }
        //走到边界
        if (dpTable[x][y] != 0 || x == 0 || y == 0) {
            return dpTable[x][y];
        } else {
            return dpTable[x][y] = dp(dpTable, m, n, x-1, y) + dp(dpTable, m, n, x, y-1);
        }
    }
};
点赞