代码随想录算法训练营Day38|动态规划part02

107 阅读3分钟

LeetCode 62 不同路径

题目链接:leetcode.cn/problems/un…

文档讲解:programmercarl.com/0062.不同路径.h…

视频讲解:www.bilibili.com/video/BV1ve…

思路

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,一共有多少种不同的路径?

在网格[i,j]处,要么从[i-1,j]向下移动而来,要么从[i, j-1]移动而来。所以我们应该从上到下,从左到右推导。

  1. 确定dp数组(dp table)以及下标的含义:dp[i][j]指走到i行j列有几种路径
  2. 确定递推公式:dp[i][j] = dp[i-1][j]+dp[i][j-1]
  3. dp数组如何初始化:dp[0][0]=1,第一行和第一列也都初始化为1
  4. 确定遍历顺序:i做外循环,j做内循环,递增遍历
  5. 举例推导dp数组:3✖️7网格,dp[0]为1,1,1,1,1,1,1;dp[1]为1,2,3,4,5,6,7;dp[2]为1,3,6,10,15,21,28

解法

class Solution {
	public int uniquePaths(int m, int n) {		
		int[][] dp = new int[m][n];		
		for (int i = 0; i < m; i++) {		
			dp[i][0] = 1;		
		}		
		for (int i = 0; i < n; i++) {		
			dp[0][i] = 1;		
		}		
		for (int i = 1; i < m; i++) {		
			for (int j = 1; j < n; j++) {			
				dp[i][j] = dp[i][j-1] + dp[i-1][j];			
			}		
		}		
		return dp[m-1][n-1];	
	}
}

LeetCode 63 不同路径 II

题目链接:leetcode.cn/problems/un…

文档讲解:programmercarl.com/0063.不同路径II…

视频讲解:www.bilibili.com/video/BV1Ld…

思路

本题和上一题知识多了一种障碍物信息,依然可以用动态规划法来分析

在网格[i,j]处,要么从[i-1,j]向下移动而来,要么从[i, j-1]移动而来,且[i-1,j]和[i, j-1]没有障碍。如果其中任一地块有障碍,则只能从没有障碍的地块移动而来。

  1. 确定dp数组(dp table)以及下标的含义:dp[i][j]指走到i行j列有几种路径
  2. 确定递推公式:dp[i][j] = dp[i-1][j]+dp[i][j-1]
  3. dp数组如何初始化:需要初始化第一行和第一列,在第一行中,没有遇到第一个障碍之前,都初始化为1,遇到后剩下的都为0。第一列同理
  4. 确定遍历顺序:i做外循环,j做内循环,递增遍历。遇到障碍的部分就跳过
  5. 举例推导dp数组:

解法

class Solution {
	public int uniquePathsWithObstacles(int[][] obstacleGrid) {	
		int m = obstacleGrid.length;		
		int n = obstacleGrid[0].length;		
		int[][] dp = new int[m][n];		
		for (int i = 0; i < m; i++) {		
			if (obstacleGrid[i][0] == 0) {			
				dp[i][0] = 1;				
			}			
			else {			
				break;			
			}		
		}		
		for (int i = 0; i < n; i++) {		
			if (obstacleGrid[0][i] == 0) {			
				dp[0][i] = 1;			
			}			
			else {			
				break;			
			}		
		}		
		for (int i = 1; i < m; i++) {		
			for (int j = 1; j < n; j++) {			
				if (obstacleGrid[i][j] == 0) {				
					dp[i][j] = dp[i-1][j] + dp[i][j-1];				
				}			
			}		
		}		
		return dp[m-1][n-1];	
	}
}

今日收获总结

今日学习2小时,不同路径中如何初始化dp数组还是很讲究的