Loading

62-不同路径

本题可以用递归算法,也可以用排列组合知识解。但是代码提交部分测试用例时间超时。

由此联想到动态规划的做法。

1.定义状态:即定义数据元素的含义,这里定义dp[i][j]为当前位置的路径数,i表示i列,j表示j行

2.建立状态转移方程:因为从题目要求中可以看出,机器人只能向右或向下移动。所以到达dp[i][j]就可能是经过dp[i-1][j]到达,
也可能是经过dp[i][j-1]到达。所以状态转移方程为:dp[i][j]=dp[i-1][j]+dp[i][j-1]

3.设定初始值:通过状态转移方程可以看出,i和j下表要从1开始,否则会导致数组溢出异常。同时每一个位置点代表到达当前位置的路径条数,所以要设置最初的路径条数即dp[i][0]=1,dp[0][j]=1,即第一行,第一列值为1。更通俗的解释就是从左上角的点到两个墙边只有一条路可走,所以两条边的值都要置为1

5.状态压缩:即优化数组空间,每次状态的更新只依赖于前一次的状态,优化一般作用于多维数组,观察是否可以将多维数组以一维数组来动态表示,即用一维数组来保存上次的状态。这道题的优化方法是存在的。具体看下面的代码解释。状态转移方程:dp[i] = dp[i-1] + dp[i]。      本题情况就是二维数组双循环展开计算即可

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> v(m);
        for(int i=0;i<m;i++)
        {
            v[i].resize(n);
        }
        for(int i=0;i<m;i++)
        {
            v[i][0]=1;
        }
        for(int i=0;i<n;i++)
        {
            v[0][i]=1;
        }
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
            {
                v[i][j]=v[i-1][j]+v[i][j-1];
            }
        }
        int result=v[m-1][n-1];
        return result;
    }


        
};
View Code

 

 

之后整理一篇关于动态规划的更好的思考方式和做题模板,给有需要的人,也给有需要的自己。现在还是不停的刷题阶段。

posted @ 2020-03-03 15:19  是凉城吖  阅读(119)  评论(0)    收藏  举报