随笔分类 - 动态规划系列
摘要:目标和(LeetCode 494 难度:中等) 下面用目标和来对比动态规划和回溯 回溯思路 任何框架的核心思想都是穷举,回溯算法是一个暴力穷举,前面写过算法框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) retur
阅读全文
摘要:打家劫舍I(LeetCode 198题 难度:中等) 题目很容易理解,而且动态规划的特征很明显。,解决动态规划问题就是找「状态」和「选择」,仅此而已。 假想你就是这个专业强盗,从左到右走过这一排房子,在每间房子前都有两种选择:抢或者不抢。 如果你抢了这间房子,那么你肯定不能抢相邻的下一间房子了,只能
阅读全文
摘要:零钱兑换②(LeetCode 518题 难度:中等) 我们可以把这个问题转化为背包问题的描述形式: 有一个背包,最大容量为amount,有一系列物品coins,每个物品的重量为coins[i],每个物品的数量无限。请问有多少种方法,能够把背包恰好装满? 这个问题和我们前面讲过的两个背包问题,有一个最
阅读全文
摘要:子集切分问题(LeetCode 416 难度:中等) 描述 对于这个问题,看起来和背包没有任何关系,为什么说它是背包问题呢? 首先回忆一下背包问题大致的描述是什么: 给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用
阅读全文
摘要:经典0-1背包问题 0-1背包问题 给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性,其中第i个物品的重量为wt[i],价值为val[i],现在你用这个背包装物品,问最多能装的价值是多少 思路分析 这个题目中的物品不可以分割,要么装进包里,要么不装,不能说切成两块装一半。这也许就
阅读全文
摘要:戳气球(LeetCode 312题 难度:困难) 题目中说 nums[0]=nums[n]=1; 动态规划思路: int n=nums.length; int point[]=new int[n+2]; int m=point.length; point[0]=point[n+1]=1; for (
阅读全文
摘要:动态规划问题:高楼扔鸡蛋 力扣 887 题 难度:困难 思路分析: 题目是这样: 你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1)。现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低于F的楼层都不会碎)。现在问你,最坏情况下
阅读全文
摘要:以最小插入次数构造回文串(难度:中等) 比如说如一个s="abcea",算法返回2,插入两个字符="abecba"或者"aebcbea"。如果输入"aba" 那么返回0,本身就是回文串,无需操作 思路分析 回文串一般都是字符串从中间向两端扩散,构造回文串也是类似的 dp数组定义 上节课说了:字符串问
阅读全文
摘要:编辑距离(LeetCode 72题 难度:困难) 编辑距离问题就是给我们两个字符串s1和s2,只能用三种操作,让我们把s1变成s2,求最少的操作数。需要明确的是,不管是把s1变成s2还是反过来,结果都是一样的,所以后文就以s1变成s2举例。 思路分析 dp数组的定义 dp[i,j]:就是s1[0..
阅读全文
摘要:最长公共子序列(LeetCode 1143题 难度:中等) 第一步:dp数组定义(字符串一般是二维) dp[i][j]:表示S1[0,i]和S2[0,J]中最长的公共子序列的长度 S1="ace" S2="babcde" 比如dp[2][4]=2的含义,就是 S1="ac"和S2=“babc”,他们
阅读全文
摘要:最大子序和(LeetCode 53题 难度:简单) dp数组定义 dp[i]就是以nums[i]结尾的"最大子数组的和" dp[i]有两种选择: 要么与前面相邻的子数组连接,形成一个更大的子序和的数组 要么不与前面连接,自成一派,自己作为一个子数组 要么 自成一派,要么与前面的子数组合 并形成更大的
阅读全文
摘要:信封嵌套问题(LeetCode 354题 难度:困难) 思路:转二维 为 一维 调用 上篇文章 解答 先对宽度w进行升序排列,如果遇到w相同的情况,则按照高度H进行降序排列(因为宽度一样不可能套娃,比如5 和5 不能同时进 去), 然后把所有的H 作为一个数组,在这个数组上进行 计算(LIS) 官方
阅读全文
摘要:dp数组的遍历方向 我相信读者做动态规划问题时,肯定会对dp数组的遍历顺序有些头疼。我们拿二维dp数组来举例,有时候我们是正向遍历: //正向遍历 int[][] dp = new int[m][n]; for (int i = 0; i < m; i++) for (int j = 0; j <
阅读全文
摘要:动态规划详解 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。 既然是要求最值,核心问题是什么呢?求解动态规划的核心问题是穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值呗。
阅读全文

浙公网安备 33010602011771号