代码随想录算法训练营Day39 || 62.不同路径 63. 不同路径 II

今天的题目深深地体会到了动态规划,遇到问题时应该先想办法进行拆解,寻找不同部分之间的关系。

问题1:62. 不同路径 - 力扣(LeetCode)

思路:观察易发现dp[i][j]点的路径对于其上方和左方的路径之和,再考虑初始化。首行和首列的点路径条数都是1,易写出如下代码:

class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m==1 && n==1) return 1;
        int dp[m][n];
        for(int i=0;i

反思:一开始我一直在纠结该怎么记录路径条数,想用一个变量去记录而忽视了去寻找后一阶段与前一阶段的关系。遇到问题时,我们应该首先对问题进行拆分,即答案可以由哪些组成,再去考虑初始化,逐个击破。

问题2:63. 不同路径 II - 力扣(LeetCode)

思路:障碍物处的路径和为0,同时当障碍物在最上面或者最左边时,遇到障碍物则停止初始化(因为只能向下和向右走)。代码如下:

class Solution {
public:
    int uniquePathsWithObstacles(vector>& obstacleGrid) {
        int a=obstacleGrid.size();
        int b=obstacleGrid[0].size();
        vector> dp(a,vector(b,0));
        if(obstacleGrid[0][0]==1 || obstacleGrid[a-1][b-1]==1) return 0;
        for(int i=0;i

反思:当题目中出现新条件时,想想它带来的影响,还是要从状态上去思考。

你可能感兴趣的:(算法)