题解 | #挤奶路径#
挤奶路径
https://www.nowcoder.com/practice/6ab56cedae0646e19fb64b8bdbad82a6
知识点:动态规划
思路:
- 首先判断起点是否为障碍物,如果是,则返回路径数量为0。
- 获取矩阵的行数n和列数m。
- 创建一个大小为n行m列的新矩阵dp,用于存储到达每个位置的路径数量。
- 将起点dp[0][0]设置为1,表示到达起点的路径数量为1。
- 使用双重循环遍历每个位置(i,j),从左上角开始到右下角。
- 对于每个位置(i,j),如果该位置为障碍物,则跳过当前循环。
- 否则,根据状态转移方程计算dp[i][j]的值:如果i > 0,说明上方位置可达,将上方位置的路径数量dp[i-1][j]加到dp[i][j]上。如果j > 0,说明左方位置可达,将左方位置的路径数量dp[i][j-1]加到dp[i][j]上。
- 循环结束后,dp[n-1][m-1]即为从起点到终点的路径数量。
- 返回dp[n-1][m-1]作为结果。
编程语言:java
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param cows int整型二维数组 * @return int整型 */ public int uniquePathsWithObstacles(int[][] cows) { if (cows[0][0] == 1) return 0; int n = cows.length, m = cows[0].length; int[][] dp = new int[n][m]; dp[0][0] = 1; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (cows[i][j] == 1) continue; if (i > 0) dp[i][j] += dp[i - 1][j]; if (j > 0) dp[i][j] += dp[i][j - 1]; } } return dp[n - 1][m - 1]; } }