C++ || Dp || Unique Paths 2
```int uniquePathsWithObstacles(vector>& obstacleGrid) {\n        int n = obstacleGrid.size();\n        int m = obstacleGrid[0].size();\n        \n        if(ob
```int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {\n        int n = obstacleGrid.size();\n        int m = obstacleGrid[0].size();\n        \n        if(obstacleGrid[0][0] == 1 || obstacleGrid[n-1][m-1] == 1){\n            return 0;\n        }\n        \n        long long dp[n][m];\n        dp[n-1][m-1] = 1;\n        bool b = true;\n        for(int  i=n-2 ; i >= 0 ; i--){\n            if(obstacleGrid[i][m-1] == 1){\n                dp[i][m-1] = 0;\n                b = false;\n            }\n            if(b){\n                dp[i][m-1] = 1;\n            }\n            else{\n                dp[i][m-1] = 0;\n            }\n        }\n        b=true;\n        for(int  i=m-2 ; i >= 0 ; i--){\n            if(obstacleGrid[n-1][i] == 1){\n                dp[n-1][i] = 0;\n                b = false;\n            }\n            if(b){\n                dp[n-1][i] = 1;\n            }\n            else{\n                dp[n-1][i] = 0;\n            }\n        }\n        for(int  i = n-2 ; i >= 0 ; i--){\n            for(int  j = m-2 ; j >= 0 ; j--){\n                if(obstacleGrid[i][j] != 1){\n                    dp[i][j] = dp[i+1][j] + dp[i][j+1];\n                }\n                else{\n                    dp[i][j] = 0;\n                }\n            }\n        }\n        \n        return (int)dp[0][0];\n    }
['Dynamic Programming', 'C', 'Matrix']