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];
    }
};

 

posted @ 2014-07-02 12:30  肥磊  阅读(518)  评论(0编辑  收藏  举报