LeetCode题解——Unique Path(DP与优化)

题目: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?

题意:在m*n的网格中,从左下角一步步走到右上角,有多少种可能的走法(每次只能横或竖移动一步)

    在第一象限的话,也就是每次走一步从(0,0)走到(m,n)有多少种走法

思路:考虑这是一个递推的问题,根据DP思想,有递推公式

我的代码比较短,因为memset只能置0或者-1,可以把数组置为-1,然后和取负就是所求结果了。

class Solution {  

public:  

    int uniquePaths(int m, int n) {  

        // Start typing your C/C++ solution below  

        // DO NOT write int main() function  

        int f[m][n];  

        memset(f, -1, sizeof(int) * m * n);  //数组全部置-1

        for (int i = 1; i < m; i++) {            //求和

            for (int j = 1; j < n; j++) {  

                f[i][j] = f[i - 1][j] + f[i][j - 1];  

            }  

        }  

        return -f[m - 1][n - 1];  //取负

    }  

};       

时间复杂度O(m*n),那么可不可以继续优化呢?

上面采用的是二维数组,现在可以用一位数组取代之,则

Fn=Fn-1+Fn;

class Solution {

public:

    int uniquePaths(int m, int n) {

        vector<int> vec(n, 1);

        for(int i=1; i<m; ++i){

            for(int j=1; j<n; ++j){

                vec[j]+=vec[j-1];

            }

        }

        return vec[n-1];

    }

};

 

你可能感兴趣的:(LeetCode)