import java.util.*;
/**
* NC325 不同路径的数目(二)
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param obstacleGrid char字符型ArrayList<ArrayList<>>
* @return int整型
*/
public int uniquePathsWithObstacles (ArrayList<ArrayList<Character>> obstacleGrid) {
return solution(obstacleGrid);
}
/**
* 动态规划
*
* dp[i][j]表示机器人移动到地图第i行第j列处的不同路径数
*
* { 1 , i=1 && j=1
* dp[i][j] = { dp[i][j-1] , i=1 && j>1
* { dp[i-1][j] , i>1 && j=1
* { dp[i][j-1] + dp[i-1][j] , i>1 && j>1
*
* @param obstacleGrid
* @return
*/
private int solution(ArrayList<ArrayList<Character>> obstacleGrid){
int m = obstacleGrid.size();
int n = obstacleGrid.get(0).size();
int[][] dp = new int[m+1][n+1];
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
if(i==1 && j==1){
if(obstacleGrid.get(i-1).get(j-1) != '#'){
dp[i][j] = 1;
}
}else if(i==1 && j>1){
if(obstacleGrid.get(i-1).get(j-1) != '#'){
dp[i][j] = dp[i][j-1];
}
}else if(i>1 && j==1){
if(obstacleGrid.get(i-1).get(j-1) != '#'){
dp[i][j] = dp[i-1][j];
}
}else{
if(obstacleGrid.get(i-1).get(j-1) != '#'){
dp[i][j] = dp[i][j-1] + dp[i-1][j];
}
}
}
}
return dp[m][n];
}
}