不同路径Ⅱ【含障碍物】动态规划 https://leetcode.cn/problems/unique-paths-ii/description/
#include<bits/stdc++.h>
using namespace std;
bool isObstacle(vector<vector<int>>& dp, int i,int j){
//if(dp[i][j]==1) return true;
//else return false;
return dp[i][j]==1;
}
int main(){
int n,m;
// 1> 输入行、列数
cin>>n>>m;
vector<vector<int>> dp(n,vector<int>(m)); // n行m列
// 2> 输入网格数组dp
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>dp[i][j];
}
}
//起点不能是障碍物
if(isObstacle(dp,0,0)){
cout<<0<<endl;
return 0;
}
// 可初始化起点
dp[0][0]=1;
//第0行 j:1~m-1(起点右侧) =左
for(int j=1;j<m;j++){
dp[0][j] = isObstacle(dp,0,j) ? 0:dp[0][j-1];
}
//第0列 i:1~n-1(起点下侧) =上
for(int i=1;i<n;i++){
dp[i][0] = isObstacle(dp,i,0) ? 0:dp[i-1][0];
}
// 【动态规划】补充其余
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
if(isObstacle(dp,i,j)){
dp[i][j]=0; //障碍物 不可达
}else{
dp[i][j]=dp[i-1][j]+dp[i][j-1]; //上+左
}
}
}
cout<<dp[n-1][m-1];
return 0;
}
/* ERROR
// 【动态规划】补充其余 “部分
for循环初始 i=0,j=0错!!!
*/