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; } };
之后整理一篇关于动态规划的更好的思考方式和做题模板,给有需要的人,也给有需要的自己。现在还是不停的刷题阶段。
——世界上从来不乏优秀的人,我只是想接近他们一点。

浙公网安备 33010602011771号