随笔分类 -  代码随想录二刷

为了加深自己对代码的印象而成 方便自己以后忘记方法论时回头可以找得到当时我的思想
摘要:✅做题思路or感想 这道困扰我一刷好久的题终于在二刷的今天彻底理解了,通透啊! 这道题的难点在于递推公式和初始化 首先可以把题目按照自己的意思更大白话的复述一遍 题面:找 s的子序列中t出现的次数 复述:在s中挑选字符来组成t,求这个操作有几种方法 dp数组含义 dp[i][j]表示[0, i - 阅读全文
posted @ 2022-04-09 18:52 北原春希 阅读(55) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 题目所求的转换一下其实就是求最大连续子序列的长度 最大连线数 = 最大连续子序列的长度 化为经典子序列问题,都适合用动态规划来解 子序列默认不连续,子数组默认连续! dp数组含义 子序列的题一般都这样子定义dp数组:dp[i][j]表示在nums1的[0, i - 1]和nums 阅读全文
posted @ 2022-04-08 18:24 北原春希 阅读(22) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 经典子序列问题,都适合用动态规划来解 子序列默认不连续,子数组默认连续! dp数组含义 子序列的题一般都这样子定义dp数组:dp[i][j]表示在test1的[0, i - 1]和test2的[0, j - 1]上最长的子序列长度(注意这里是范围里的最长子序列长度!) 为什么要这 阅读全文
posted @ 2022-04-08 18:24 北原春希 阅读(27) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 经典子序列问题,都适合用动态规划来解 子序列默认不连续,子数组默认连续! dp数组含义 子序列的题一般都这样子定义dp数组:dp[i][j]表示以nums1[i - 1]结尾和以nums2[j - 1]结尾的公共子数列长度 为什么要这样子定义呢,因为这样子更方便针对空子数组做操作 阅读全文
posted @ 2022-04-08 18:23 北原春希 阅读(32) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 暴力解法 “连续”,“递增”要素过多,一眼暴力 class Solution { public: int findLengthOfLCIS(vector<int>& nums) { int result = 1, sum = 1; for (int i = 1; i < nums 阅读全文
posted @ 2022-04-07 16:15 北原春希 阅读(43) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 这种“最长递增子序列”是经典的动态规划的题,虽然我在看到的第一瞬间并没有反应过来用dp,可惜 dp数组含义 dp[i],以nums[i]结尾的最大递增子序列的长度 推导公式 当 nums[i] > nums[j] 时: nums[i]可以接在nums[j] 之后(此题要求严格递增 阅读全文
posted @ 2022-04-07 15:53 北原春希 阅读(34) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 一道股票问题,特点是在卖出的时候要考虑税收的因素 买入一次卖出一次算一次交易,所以在卖出那里扣税收就可以了 dp数组含义 dp[i][0]是第i天持有股票时能获得的最大利润 dp[i][1]是第i天没有股票时能获得的最大利润 推导公式 dp[i][0] = max(dp[i - 阅读全文
posted @ 2022-04-07 15:20 北原春希 阅读(16) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 这一题不能用状态的方法去思考,会很绕。只关注卖出的那一天就好了 这里的处理是把冷冻期放进了dp[i][0]中一并考虑了 dp数组含义 0.不持股且当天没卖出,定义其最大收益dp[i][0]; 1.持股,定义其最大收益dp[i][1]; 2.不持股且当天卖出了,定义其最大收益dp[ 阅读全文
posted @ 2022-04-07 15:06 北原春希 阅读(31) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 股票问题 + 找规律,找到规律后就很简单了 顺便一说,一次交易包括一次卖出和买入!!!故这里总的交易次数是2 * k dp数组含义 dp[i][j]:第i天第j次交易持有股票的状态 dp[i][j + 1]:第i天第j次交易没有股票的状态 推导公式 不如来看一下k = 2时的递推 阅读全文
posted @ 2022-04-07 14:03 北原春希 阅读(21) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 考验的是对二维dp数组的理解和运用,一维是天数,二维是状态,了解了就很好做了 dp数组含义 dp[i][0]:第一次交易持有股票能获得的最大利润 dp[i][1]:第一次交易没有股票能获得的最大利润 dp[i][2]:第二次交易持有股票能获得的最大利润 dp[i][3]:第二次交 阅读全文
posted @ 2022-04-07 13:20 北原春希 阅读(25) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 经典股票问题,这一题的特点是:股票只能交易多次 而这和股票可以单次交易的区别在于推导公式 dp数组含义 dp[i][0]:第i 天持有股票的最大利润 dp[i][1]:第i天没有股票的最大利润 推导公式 持有股票的来源:可以前一天就有股票了,也可能是今天才买股票,二者取最大利润的 阅读全文
posted @ 2022-04-07 13:00 北原春希 阅读(23) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 经典股票问题,这一题的特点是:股票只能交易一次 而这和股票可以重复次交易的区别在于推导公式 dp数组含义 dp[i][0]:第i 天持有股票的最大利润 dp[i][1]:第i天没有股票的最大利润 推导公式 持有股票的来源:可以前一天就有股票了,也可能是今天才买股票,二者取最大利润 阅读全文
posted @ 2022-04-07 12:57 北原春希 阅读(25) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 看得出来是动态规划,但想了半天解不出来。。。。 可以转化为背包问题中的是否能把背包装满的问题,因为词典里的词可以重复用,所以这是一个完全背包 dp数组含义 dp[i]表示长度为i的字符串能不能被被分解(其实就是容量为i的背包能否被装满) 💡递推公式 设wordSize是遍历到的 阅读全文
posted @ 2022-04-07 12:35 北原春希 阅读(49) 评论(0) 推荐(0) 编辑
摘要:✅装满完全背包的最小物品总价值 仍然如题,不过这一题的每一个物品的价值需要自己算出来\ 其余的都是套模板的老生常谈了 class Solution { public: //装满完全背包后物品的最小总价值 int numSquares(int n) { vector<int>value; vector 阅读全文
posted @ 2022-04-05 21:38 北原春希 阅读(21) 评论(0) 推荐(0) 编辑
摘要:✅装满完全背包的最小物品总价值 这里类型如题,不过是把价值改成了个数 故在初始化dp数组时要注意初始化大一点。然后即是别忘了有dp[0] = 0,这个是求价值的基础 然后因为是完全背包,所以背包容量遍历顺序为正序 因为这里是求价值,跟物品是组合还是排列无关,所以这里既可以先遍历物品,在遍历背包容量, 阅读全文
posted @ 2022-04-05 21:17 北原春希 阅读(44) 评论(0) 推荐(0) 编辑
摘要:✅求装满背包的物品的排列总和 这里是求排列,而不是组合!!!即是[1,2], [2, 1]是两个东西 💡在背包问题里求排列的方法是: 排列:先遍历背包容量,再遍历物品 组合:先遍历物品,再遍历背包容量 这里再注意到这里是完全背包,再遍历背包容量的时候正序就好了 class Solution { p 阅读全文
posted @ 2022-04-05 20:54 北原春希 阅读(18) 评论(0) 推荐(0) 编辑
摘要:✅装满完全背包的方法数 经典完全背包的问题 dp数组的含义 dp[i]指装满容量为i的完全背包所用的方法数 递推公式 装满背包的方法的一般递推公式:dp[j] += dp[j - coins[i]] 初始化 老规矩,当容量为0时,装满它的方法只有一个:什么也不干,固有dp[0] = 1 遍历顺序 遍 阅读全文
posted @ 2022-04-05 20:38 北原春希 阅读(17) 评论(0) 推荐(0) 编辑
摘要:✅做题思路or感想 一道01背包问题,有所不同的是这里背包的价值是“个数” 这里每一个物品都有两种重量,所以背包也设有两种容量就好了,二维背包走起来 dp数组的含义 dp[i][j]表示容量为i,j的背包所能容纳的最大元素个数 递推公式 经典01背包公式的两个容量版,以及把价值变成了个数:dp[i] 阅读全文
posted @ 2022-04-05 20:21 北原春希 阅读(16) 评论(0) 推荐(0) 编辑
摘要:✅01背包中"装满背包有几种方法"的问题 这道题难就难在如何把题面转化为背包问题 💡由题知left + right = sum, left - right = target,故有left = (sum + target) / 2,则此时就转化为了装满容量为left的背包有几种方法 当然这里要讨论一 阅读全文
posted @ 2022-04-05 20:01 北原春希 阅读(177) 评论(0) 推荐(0) 编辑
摘要:✅01背包中是"否能装满"的问题 如果能把数组分割成两个子集且使得子集的元素和相等,那么证明该集合的元素总和必须要是能被2整除的,这是一个前提条件 假设总和为sum,那问题就转化成了余下的元素是否能装满容量为sum / 2的背包 再其次,因为每一个元素只能使用一次,所以这是一个0 - 1背包 💡这 阅读全文
posted @ 2022-04-05 19:24 北原春希 阅读(25) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示