算法训练营day39_动态规划(3.11)

文章介绍了使用动态规划解决从起点到终点的不同路径数量的问题,包括没有障碍的经典路径计数和考虑障碍的路径计数。在实现中,通过初始化矩阵并逐层填充来计算每个位置的路径数。对于有障碍的情况,需要检查当前位置是否可通行。
摘要由CSDN通过智能技术生成

算法训练营day39_动态规划(3.11)

62.不同路径

求(1,1)到(m,n)的方案数;

  • f(i,j):从(1,1)到(i,j)的方案数;
  • f(i,j)=f(i-1,j)+f(i,j-1);就是从上方来或者从左方来;
  • f(1,1)要初始化为1;
  • 遍历两层,(1,1)的时候跳过;
class Solution {
public:
    int f[110][110];

    int uniquePaths(int m, int n) {
        memset(f,0,sizeof f);
        f[1][1]=1;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(i==1&&j==1) continue;
                f[i][j]=f[i-1][j]+f[i][j-1];
            }
        }
        return f[m][n];
    }
};

63.不同路径II

跟上题有些不同:

  • 起点为(0,0),要注意是否越界;
  • 路上有障碍,有障碍的地方不能过;

坑点在于:终点有可能是障碍,刚开始没注意这个;

class Solution {
public:
    int f[101][101];

    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        memset(f,0,sizeof f);
        if(obstacleGrid[obstacleGrid.size()-1][obstacleGrid[0].size()-1]==1) return 0;

        f[0][0]=1;
        for(int i=0;i<obstacleGrid.size();i++){
            for(int j=0;j<obstacleGrid[i].size();j++){
                if(i==0&&j==0) continue;
                if(obstacleGrid[i][j]==1) continue;
                if(i-1>=0&&obstacleGrid[i-1][j]!=1) f[i][j]+=f[i-1][j];
                if(j-1>=0&&obstacleGrid[i][j-1]!=1) f[i][j]+=f[i][j-1];
            }
        }
        return f[obstacleGrid.size()-1][obstacleGrid[0].size()-1];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值