![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 64
想名字多费事
编程小白入驻
展开
-
4键键盘(Leetcode651)
思路:动态规划题目中提到的有四个按键,但实际上,我们可以压缩为2个选择,因为对于最优解,Ctrl+V一定在Ctrl+A-Ctrl+C两个按键后【dp数组含义】:按键i次后屏幕显示dp[i]个A【状态】:剩余可按键数量N【选择】:①按A;②按Ctrl+V(需通过额外变量j来确定Ctrl+C的位置,从而确定剪贴板中A的个数dp[j - 2])【状态转移方程】:dp[i] = max(dp[i - 1] + 1, dp[j - 2] * (i - j + 1));#includ.原创 2021-09-17 10:09:29 · 444 阅读 · 0 评论 -
最大连续1的个数
解法一:暴力遍历class Solution {public: int findMaxConsecutiveOnes(vector<int>& nums) { int res=0,temp=0; auto it=nums.begin(); while(it!=nums.end()){ if(*(it++)==1) ++temp;//一直累积1的数量 else { .原创 2021-09-10 11:31:05 · 100 阅读 · 0 评论 -
最小路径和
class Solution {public: int minPathSum(vector<vector<int>>& grid) { vector<vector<int>> dp(grid.size(),vector<int>(grid[0].size(),0)); for(int ii=0;ii<grid.size();ii++){ if(ii==0) dp[ii.原创 2021-08-26 09:46:14 · 71 阅读 · 0 评论 -
最长回文子序列
回文子串是要连续的,回文子序列不是连续的!思路差不多,但本题要比求回文子串简单一点,因为情况少了一点。确定dp数组(dp table)以及下标的含义dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。确定递推公式在判断回文子串的题目中,关键逻辑就是看s[i]与s[j]是否相同。如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[..原创 2021-06-19 10:59:32 · 220 阅读 · 0 评论 -
回文子串个数
1. 确定dp数组(dp table)以及下标的含义布尔类型的dp[i][j]:表示区间范围[i,j](注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。2. 确定递推公式在确定递推公式时,整体上有两种情况,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。当s[i]与s[j]不相等,dp[i][j]一定是false。当s[i]与s[j]相等时,又分为如下三种情况情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串情况二:下标i.原创 2021-06-19 10:50:54 · 1510 阅读 · 0 评论 -
绝杀编辑距离
确定dp数组(dp table)以及下标的含义dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。确定递推公式在确定递推公式的时候,首先要考虑清楚编辑的几种操作,整理如下:if (word1[i - 1] == word2[j - 1]) 不操作if (word1[i - 1] != word2[j - 1]) 增 | 删 | 换也就是如上四种情况。if (word1[i - 1] == word.原创 2021-06-18 12:11:42 · 72 阅读 · 0 评论 -
两个字符串的删除操作
思路本题和动态规划:115.不同的子序列相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。1. 确定dp数组(dp table)以及下标的含义dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。2. 确定递推公式当word1[i - 1] 与 word2[j - 1]相同的时候当word1[i - 1] 与 word2[j - 1]不相同的时候当word1[i - 1] 与 wo.原创 2021-06-18 11:26:58 · 253 阅读 · 0 评论 -
不同的子序列
思路这道题目如果不是子序列,而是要求连续序列的,那就可以考虑用KMP。1. 确定dp数组(dp table)以及下标的含义dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。2. 确定递推公式这一类问题,基本是要分析两种情况s[i - 1] 与 t[j - 1]相等s[i - 1] 与 t[j - 1] 不相等一、当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。一部分是用s[i - 1]来匹配,那么个数为.原创 2021-06-18 09:51:34 · 131 阅读 · 0 评论 -
判断子序列
(这道题可以用双指针的思路来实现,时间复杂度就是O(n))这道题应该算是编辑距离的入门题目,因为从题意中我们也可以发现,只需要计算删除的情况,不用考虑增加和替换的情况。所以掌握本题也是对后面要讲解的编辑距离的题目打下基础。动态规划五部曲分析如下:确定dp数组(dp table)以及下标的含义dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。注意这里是判断s是否为t的子序列。即t的长度是大于等于s的。确定递推公式在..原创 2021-06-17 11:03:14 · 97 阅读 · 1 评论 -
最大子序和
确定dp数组(dp table)以及下标的含义dp[i]:包括下标 i 之前的最大连续子序列和为 dp[ i ]。确定递推公式dp[i]只有两个方向可以推出来:1、 dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和2、 nums[i],即:从头开始计算当前连续子序列和一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);dp数组如何初始化从递推公式可以看出来dp[i]是依赖于dp[i - 1]的状态,d.原创 2021-06-17 10:31:38 · 48 阅读 · 0 评论 -
不相交的线
思路:绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且直线不能相交!直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。那么求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!class Solution {public: int maxUncrossedLines(vector<int>& nums1, vecto.原创 2021-06-17 09:25:23 · 97 阅读 · 0 评论 -
最长公共子序列
思路本题和动态规划:718. 最长重复子数组区别在于这里不要求是连续的了,但要有相对顺序,即:“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。1. 确定dp数组(dp table)以及下标的含义dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j -1]的字符串text2的最长公共子序列为dp[i][j]2. 确定递推公式主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1.原创 2021-06-16 19:13:11 · 95 阅读 · 0 评论 -
最长连续递增序列
思路本题要求的是最长连续递增序列确定dp数组(dp table)以及下标的含义dp[i]:以下标i为结尾的数组的连续递增的子序列长度为dp[i]。注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置。确定递推公式如果 nums[i ] > nums[i-1],那么以 i为结尾的数组的连续递增的子序列长度 一定等于 以i-1为结尾的数组的连续递增的子序列长度 + 1 。即:dp[ i ] = dp[ i-1 ] + 1;注意这里就体现出和动态规划:300.最长递增子序列.原创 2021-06-16 12:00:35 · 152 阅读 · 0 评论 -
最长递增子序列
思路最长上升子序列是动规的经典题目,这里dp[i]是可以根据dp[j] (j < i)推导出来的。1. dp[i]的定义dp[i]表示i之前包括i的最长上升子序列长度。2. 状态转移方程位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值。.原创 2021-06-15 21:00:49 · 114 阅读 · 0 评论 -
买卖股票的最佳时机含手续费
相对于动态规划:122.买卖股票的最佳时机II,本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。唯一差别在于递推公式部分dp[i][0] 表示第i天持有股票所省最多现金。dp[i][1] 表示第i天不持有股票所得最多现金如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i -.原创 2021-06-15 14:50:23 · 259 阅读 · 0 评论 -
最佳买卖股票时机含冷冻期
确定dp数组以及下标的含义dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。出现冷冻期之后,状态其实比较复杂,例如今天买入股票、今天卖出股票、今天是冷冻期。具体可以区分出如下四个状态:0:状态一:买入股票状态(今天买入股票,或者是之前就买入了股票然后没有操作)卖出股票状态,这里细分就有两种卖出股票状态1:状态二:两天前就卖出了股票,度过了冷冻期,一直没操作,今天保持卖出股票状态2:状态三:今天卖出了股票3:状态四;今天为冷冻期状态,但冷冻期状态不可持续,只有一天!.原创 2021-06-14 12:09:10 · 141 阅读 · 0 评论 -
买卖股票的最佳时机IV
思路这道题目可以说是动态规划:123.买卖股票的最佳时机III的进阶版,这里要求至多有k次交易。确定dp数组以及下标的含义在动态规划:123.买卖股票的最佳时机III中,我是定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]j的状态表示为:0 表示不操作1 第一次买入2 第一次卖出3 第二次买入4 第二次卖出…大家应该发现规律了吧 ,除了0以外,偶数就是卖出,奇数就是买入。题目要求.原创 2021-06-14 09:51:45 · 132 阅读 · 0 评论 -
买卖股票的最佳时机III
思路这道题目相对 121.买卖股票的最佳时机 和 122.买卖股票的最佳时机II 难了不少。关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。确定dp数组以及下标的含义一天一共就有五个状态,0.没有操作1.第一次买入2. 第一次卖出3. 第二次买入4. 第二次卖出dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。确定递推公式需要注意:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定.原创 2021-06-13 14:54:15 · 81 阅读 · 0 评论 -
买卖股票的最佳时机II
思路本题和121. 买卖股票的最佳时机的唯一区别本题股票可以买卖多次了(注意只有一只股票,所以再次购买前要出售掉之前的股票)这里重申一下dp数组的含义:dp[i][0] 表示第i天持有股票所得现金。dp[i][1] 表示第i天不持有股票所得最多现金如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:.原创 2021-06-12 14:56:57 · 247 阅读 · 2 评论 -
买卖股票最佳时机I
暴力解法(超时)暴力,找最优间距时间复杂度:O(n^2)空间复杂度:O(1)class Solution {public: int maxProfit(vector<int>& prices) { int profit=0; for(int ii=0;ii<prices.size();ii++){ //int buy=prices[ii]; for(int jj=ii+1;jj&l.原创 2021-06-12 13:00:36 · 108 阅读 · 0 评论 -
还要打家劫舍
思路这道题目和 198.打家劫舍,213.打家劫舍II也是如出一辙,只不过这个换成了树。对于树的话,首先就要想到遍历方式,前中后序(深度优先搜索)还是层序遍历(广度优先搜索)。本题一定是要后序遍历,因为通过递归函数的返回值来做下一步计算。与198.打家劫舍,213.打家劫舍II一样,关键是要讨论当前节点抢还是不抢。如果抢了当前节点,两个孩子就不能抢,如果没抢当前节点,就可以考虑抢左右孩子(注意这里说的是“考虑”)暴力递归代码如下:class Solution {public: .原创 2021-06-11 16:45:55 · 115 阅读 · 1 评论 -
继续打家劫舍
思路这道题目和198.打家劫舍是差不多的,唯一区别就是成环了。对于一个数组,成环的话主要有如下三种情况:情况一:考虑不包含首尾元素情况二:考虑包含首元素,不包含尾元素情况三:考虑包含尾元素,不包含首元素注意我这里用的是"考虑",例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况三,取nums[1] 和 nums[3]就是最大的。而情况二 和 情况三 都包含了情况一了,所以只考虑情况二和情况三就可以了。代码如下:class Solution {public: .原创 2021-06-11 14:38:40 · 69 阅读 · 1 评论 -
开始打家劫舍
思路打家劫舍是dp解决的经典问题之一确定dp数组(dp table)以及下标的含义dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。确定递推公式决定dp[i]的因素就是第i房间偷还是不偷。如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。如果不偷第i房间,那么dp[i] = dp[i - 1],即考.原创 2021-06-11 13:26:56 · 95 阅读 · 0 评论 -
背包问题大总结
几种常见背包之间的关系。背包五部曲确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组背包递推公式问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); ,对应题目如下:动态规划:416.分割等和子集动态规划:1049.最后一块石头的重量 II问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:动态规划:494.原创 2021-06-10 17:18:37 · 122 阅读 · 0 评论 -
单词拆分!
回溯法之前的一道题目回溯算法:131分割回文串,就是枚举字符串的所有分割情况。回溯算法:分割回文串:是枚举分割后的所有子串,判断是否回文。本道是枚举分割所有字符串,判断是否在字典里出现过。所以回溯法C++代码:时间复杂度:O(2^n),因为每一个单词都有两个状态,切割和不切割空间复杂度:O(n),算法递归系统调用栈的空间class Solution {private: bool backtracking (const string& s, const unordered_s.原创 2021-06-10 17:07:51 · 305 阅读 · 0 评论 -
完全平方数
乍一看可能感觉没啥思路,又平方和的,又最小数的。其实完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目动态规划:322. 零钱兑换就是一样一样的!动规五部曲分析如下:确定dp数组(dp table)以及下标的含义dp[i]:和为 i 的完全平方数的最少数量为 dp[ i ]确定递推公式dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。.原创 2021-06-10 14:10:58 · 230 阅读 · 0 评论 -
零钱兑换I
思路题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。确定dp数组以及下标的含义dp[ j ]:凑足总额为 j 所需钱币的最少个数为 dp[ j ]确定递推公式得到dp[j](考虑coins[i]),只有一个来源,dp[j - coins[i]](没有考虑coins[i])。凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])所.原创 2021-06-09 18:28:51 · 110 阅读 · 0 评论 -
爬楼梯-完全背包版
将本题条件改为:一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?思路1阶,2阶,… m阶就是物品,楼顶就是背包。每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。 问跳到楼顶有几种方法其实就是问装满背包有几种方法。此时应该发现这就是一个完全背包问题了!和题目动态规划:377. 组合总和 Ⅳ基本就是一道题了。确定dp数组以及下标的含义dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。确定递推公式在动态规划:494.目标和 、 动态规划.原创 2021-06-09 18:28:36 · 170 阅读 · 0 评论 -
组合总和IV
本题题目描述说是求组合,但又说是可以元素相同顺序不同的组合算两个组合,其实就是求排列!弄清什么是组合,什么是排列很重要。组合不强调顺序,(1,5)和(5,1)是同一个组合。排列强调顺序,(1,5)和(5,1)是两个不同的排列。但其本质是本题求的是排列总和,而且仅仅是求排列总和的个数,并不是把所有的排列都列出来。如果本题要把排列都列出来的话,只能使用回溯算法爆搜。动规五部曲分析如下:确定dp数组以及下标的含义dp[i]: 凑成目标正整数为i的排列个数为dp[i]确定递推公式dp[i..原创 2021-06-08 18:10:23 · 206 阅读 · 0 评论 -
零钱兑换II
但本题和纯完全背包不一样,纯完全背包是能否凑成总金额,而本题是要求凑成总金额的个数!注意题目描述中是凑成总金额的硬币组合数,为什么强调是组合数呢?例如示例一:5 = 2 + 2 + 15 = 2 + 1 + 2这是一种组合,都是 2 2 1。如果问的是排列数,那么上面就是两种排列了。组合不强调元素之间的顺序,排列强调元素之间的顺序确定dp数组以及下标的含义dp[j]:凑成总金额j的货币组合数为dp[j]确定递推公式dp[j] (考虑coins[i]的组合总和) 就是所有的dp[.原创 2021-06-08 17:28:13 · 102 阅读 · 0 评论 -
完全背包理论基础
完全背包有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方是每种物品有无限件。leetcode上没有纯完全背包问题,都是需要完全背包的各种应用,需要转化成完全背包问题。01背包和完全背包唯一不同就是体现在遍历顺序上01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。for(int i = 0;原创 2021-06-08 16:38:41 · 202 阅读 · 0 评论 -
一和零!!
本题考察的不是多重背包多重背包是每个物品,数量不同的情况。本题中strs 数组里的元素就是物品,每个物品只有一个!而m 和 n相当于是一个两个维度的背包。所以本题其实是01背包问题!这不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。开始动规五部曲:确定dp数组(dp table)以及下标的含义dp[i][j]:最多有 i 个 0 和 j 个 1 的 strs 的最大子集的大小为 dp[ i ][ j ]。或者可以理解为一个最多装 i 个 0 和.原创 2021-06-07 17:54:09 · 69 阅读 · 0 评论 -
目标和!!
题目链接回溯法(会超时)本题要解决如何使表达式结果为target的问题。既然为target,那么就一定有 left组合 - right组合 = target。left + right等于sum,而sum是固定的。那么left - (sum - left) = target所以left = (target + sum)/2 。target是固定的,sum是固定的,left就可以求出来。此时问题就是在集合nums中找出和为left的组合class Solution {public:原创 2021-06-07 15:55:48 · 62 阅读 · 0 评论 -
最后一块石头的重量II
题目链接https://leetcode-cn.com/problems/last-stone-weight-ii/本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。接下来进行动规五步曲:确定dp数组以及下标的含义dp[j]表示容量为j的背包,最多可以背dp[j]这么重的石头。确定递推公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);dp[j - stones[i]] + stones[i原创 2021-06-06 09:42:37 · 302 阅读 · 0 评论 -
分割子集。
思路这道题目初步看,是如下两题几乎是一样的,大家可以用回溯法,解决如下两题698.划分为k个相等的子集473.火柴拼正方形这道题目是要找是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。那么只要找到集合里能够出现 sum / 2 的子集总和,就算是可以分割成两个相同元素和子集了。本题是可以用回溯暴力搜索出所有答案的,但最后超时了,放弃回溯,直接上01背包吧。01背包问题背包问题,大家都知道,有N件物品和一个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的.原创 2021-06-05 16:58:11 · 169 阅读 · 0 评论 -
背包必备理论基础2
上一篇是用二维dp数组来讲解01背包。这一篇说一说滚动数组,就是把二维dp降为一维dp。接下来还是用如下这个例子来进行讲解背包最大重量为4。问:背包能背的物品最大价值是多少?一维dp数组(滚动数组)对于背包问题其实状态都是可以压缩的。在使用二维数组的时候,递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);i是物品,j是背包容量。dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背原创 2021-06-05 15:45:05 · 83 阅读 · 0 评论 -
背包必备理论基础1
整体背包重点是01背包和完全背包。而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。所以背包问题的理论基础重中之重是01背包下面举一个例子:背包最大重量为4。物品 重量 价值物品0 1 15物品1 3 20物品2 4 30问背包能背的物品最大价值是多少?二维dp数组01背包确定dp数组以及下标的含义对于背包问题,有一种写法, 是使用二维数组,即dp[i][j]表示从下标为[0-i]的物品..原创 2021-06-05 11:34:33 · 168 阅读 · 1 评论 -
不同的二叉搜索树
先举例探探规律来看看n为3的时候,有哪几种情况。当1为头结点,其右子树有两个节点,这两个节点的布局,和 n 为2的时候两棵树的布局一样。当3为头结点,其左子树有两个节点,这两个节点的布局,是不是和n为2的时候两棵树的布局也是一样!当2为头结点,其左右子树都只有一个节点,布局和n为1时只有一棵树的布局也一样!发现到这里,其实我们就找到的重叠子问题了,也就是发现**可以通过dp[1] 和 dp[2] 来推导出来dp[3]**的某种方式。dp[3],就是 元素1为头结点搜索树的数量 .原创 2021-06-04 11:17:18 · 649 阅读 · 0 评论 -
整数拆分!
思路确定dp数组(dp table)以及下标的含义dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。确定递推公式可以想 dp[i]最大乘积是怎么得到的呢?其实可以从1遍历j,然后有两种渠道得到dp[i].一个是j * (i - j) 直接相乘。一个是j * dp[i - j],相当于是拆分(i - j),对这个拆分不理解的话,可以回想dp数组的定义。j不用拆分是因为j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了。那么从1遍历j,比较(i - j) * j和dp[i -.原创 2021-06-03 16:23:45 · 288 阅读 · 0 评论 -
不同路径II
思路确定dp数组(dp table)以及下标的含义dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。确定递推公式递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。但需要注意,由于有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)。所以代码为:if (obstacleGrid[ii][jj] == 0) { // 当(ii, jj)没有障碍的时候,再推导dp[i][j]..原创 2021-06-03 14:55:41 · 69 阅读 · 0 评论