思路
- 动态规划,在没有障碍物的时候
dp[i][j] = dp[i-1][j] + dp[i][j-1]
,当一旦有障碍物时dp[i][j] = 0
也就是此路不通,任何需要借助这个位置的路径都不可以在此位置上获得该点的路径加成。 - 在边界位置
dp[i][j] = d[i-1][j];dp[i][j] = dp[i][j-1]
上一个节点有路那么就有路而且是一条,如果没有就是没有了 - 初始位置不在一定是1,如果初始位置是障碍物的位置,那么
dp[0][0]=0 or dp[0][0] = 1;
代码
#include<stdio.h>
#include<string.h>
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
int i,j;
int dp[obstacleGridSize][*obstacleGridColSize];
memset(dp,0,sizeof(dp));
if(*((int*)obstacleGrid)==1)
dp[0][0] = 0;
else dp[0][0] = 1;
for(i=0;i<obstacleGridSize;i++){
for(j=0;j<*obstacleGridColSize;j++){
if(*((int*)obstacleGrid+i*(obstacleGridColSize)+j)==1)
dp[i][j] = 0;
else {
if(i>0&&j>0)
dp[i][j]=dp[i-1][j]+dp[i][j-1];
else if(i==0&&j==0)
dp[i][j] = 1;
else if(i==0)
dp[i][j] = dp[i][j-1];
else if(j==0)
dp[i][j] = dp[i-1][j];
}
}
}
return dp[obstacleGridSize-1][(*obstacleGridColSize)-1];
}