Unique Paths II

本文介绍了一种算法,用于计算在存在障碍的情况下从左上角到右下角的唯一路径数量。该算法使用动态规划,首先初始化起点和边界条件,然后递推计算每个格子可达路径的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Follow up for "Unique Paths":

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

For example,

There is one obstacle in the middle of a 3x3 grid as illustrated below.


python

class Solution:
    # @param obstacleGrid, a list of lists of integers
    # @return an integer
    def uniquePathsWithObstacles(self, obstacleGrid):
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        if obstacleGrid[0][0]==1:
            return 0
        
        all = [[0]*n for i in range(m)]
        for i in range(n):
            if obstacleGrid[0][i]==0:
                all[0][i] = 1
            else:
                break
        for i in range(1,m):
            if obstacleGrid[i][0]==0:
                all[i][0] = 1
            else:
                break
        
        for i in range(1,m):
            for j in range(1,n):
                if obstacleGrid[i][j]==0:
                    if obstacleGrid[i-1][j]==0:
                        all[i][j] += all[i-1][j]
                    if obstacleGrid[i][j-1]==0:
                        all[i][j] += all[i][j-1]
        
        return all[m-1][n-1]
                        
                        
                        
                        
                        
                        
                        

c++

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
        const int m = obstacleGrid.size();
        const int n = obstacleGrid[0].size();
        if (m==0 || n==0 || obstacleGrid[0][0]==1) return 0;
        
        int all[m][n];
        all[0][0] = 1;
        for (int i=1;i<n;i++){
            if(obstacleGrid[0][i]==1){ all[0][i] = 0; }
            else{ all[0][i] = all[0][i-1]; }
        }
        for (int i=1;i<m;i++){
            if(obstacleGrid[i][0]==1){ all[i][0] = 0; }
            else{ all[i][0] = all[i-1][0]; }
        }
        
        for (int i=1;i<m;i++){
            for (int j=1;j<n;j++){
                all[i][j] = 0;
                if(obstacleGrid[i][j]==0){
                    if(obstacleGrid[i-1][j]==0) all[i][j] += all[i-1][j];
                    if(obstacleGrid[i][j-1]==0) all[i][j] += all[i][j-1];
                }
            }
        }
        
        return all[m-1][n-1];
    }
};


summary:
1. 注意c++ 不好初始化,但是python 很容易初始化



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值