import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cows int整型二维数组 
     * @return int整型
     */
    public int uniquePathsWithObstacles(int[][] cows) {
        int[][] dp = new int[cows.length][cows[0].length];
        // 初始化dp数组
        for (int i = 0; i < cows.length; i++) {
            if (cows[i][0] == 0) {
                dp[i][0] = 1;
            }else{
                break;
            }
        }
        for (int i = 0; i < cows[0].length; i++) {
            if (cows[0][i] == 0) {
                dp[0][i] = 1;
            } else{
                break;
            }
        }
        for (int i = 1; i < cows.length; i++) {
            for (int j = 1; j < cows[0].length; j++) {
                if(cows[i][j]==1){
                    dp[i][j] = 0;
                }else{
                    dp[i][j] = dp[i-1][j]+dp[i][j-1];
                }
            }
        }
        return dp[cows.length-1][cows[0].length-1];
    }
}

本题知识点分析:

1.动态规划

2.数组遍历

3.数学模拟

本题解题思路分析:

1.dp数组是什么?dp数组代表到底m,n位置有几种解法

2.dp数组推导公式, dp[i][j] = dp[i-1][j]+dp[i][j-1];常规公式,要么是向右走到的,要么是向下走到的。

3.dp数组初始化,初始化第一行和第一列就行,如果遇到0说明可以走,那么dp设置为1,有一种解法,如果遇到了1直接break,因为后面的格子必不可能走,因为不能返回走,比如向上或者向左是不可能的。注意break。

4.确定遍历顺序,从dp[1][1]开始,如果遇到了障碍物,那么设置为0,否则解法就是 dp[i][j] = dp[i-1][j]+dp[i][j-1];也就是求和。

本题使用编程语言: Java

如果您觉得本篇文章对您有帮助,可以点个赞支持一下,感谢~