
算法沉思
C++
西南男子单身联盟
所以抛弃杂念吧,只管义无反顾地前进。
展开
-
刷代码随想录有感(132):动态规划——最长回文子序列
如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。首先要考虑当i 和j 相同的情况,从递推公式:dp[i][j] = dp[i + 1][j - 1] + 2;2.递推公式:如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;所以需要手动初始化一下,当i与j相同,那么dp[i][j]一定是等于1的,即:一个字符的回文子序列长度就是1。原创 2024-07-11 22:11:05 · 247 阅读 · 0 评论 -
刷代码随想录有感(131):动态规划——回文子串
我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。原创 2024-07-10 20:11:40 · 361 阅读 · 0 评论 -
刷代码随想录有感(130):动态规划——编辑距离
时刻需要清楚dp[i][j]的定义原创 2024-07-09 19:00:40 · 315 阅读 · 0 评论 -
刷代码随想录有感(129):动态规划——两个字符串的删除操作
思路:将两个字符串除公共最长子序列以外的所有字符删除,所以问题便转换成了找出公共最长子序列,删除操作的步数即为两个字符串长度总和减去2 * 最长公共子序列长度。原创 2024-07-08 17:40:35 · 163 阅读 · 0 评论 -
刷代码随想录有感(128):动态规划——不同的子序列
一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。原创 2024-07-07 19:56:01 · 347 阅读 · 0 评论 -
刷代码随想录有感(127):动态规划——判断是否为子序列
判断s是否为t的子序列,实质上就是看s与t的最长公共子序列是否为s。原创 2024-07-06 22:39:42 · 229 阅读 · 0 评论 -
刷代码随想录有感(126):动态规划——不相交的线
本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!原创 2024-07-05 15:47:52 · 237 阅读 · 0 评论 -
刷代码随想录有感(125):动态规划——最长公共子序列
递推公式:如果相同,则后一个为前一个长度加一;如果不相同(如图c不等于e),情况一:考虑c不考虑e,则变成abc与ac的最长公共子序列,此时为dp[i][j-1]; 情况二:考虑e不考虑c,则变成ace与ab的最长公共子序列,此时为dp[i-1][j]。综上最后dp[i][j]取他们当中最大的一个。原创 2024-07-04 18:05:32 · 255 阅读 · 0 评论 -
刷代码随想录有感(124):动态规划——最长重复子数组
定义:dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]原创 2024-07-03 13:39:27 · 256 阅读 · 0 评论 -
刷代码随想录有感(123):动态规划——最长连续递增子序列
dp[i]定义为以i结尾的最长连续子序列,如果nums[i] > nums[i - 1]则说明递增,dp[i]一定是dp[i - 1] + 1,最后把最长的那个输出即可(不同结尾长度不同,不一定是最后一个最长)。原创 2024-07-02 13:06:16 · 264 阅读 · 0 评论 -
刷代码随想录有感(122):动态规划——最长子序列
dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值,即:dp[i]为dp[j]+1的最大值,递推体现在由dp[j]+1推出dp[i]。原创 2024-07-01 17:36:25 · 169 阅读 · 0 评论 -
刷代码随想录有感(121):贪心算法——买卖股票的最佳时机III
更新buy2为当前价格减去sell1和之前的buy2中的较小值,表示在当前价格下第二次买入股票时的最低花费, 通过不断更新,我们可以确保在第二次买入时不会支付比第一次卖出后更高的价格,从而避免亏损原创 2024-06-30 13:09:54 · 231 阅读 · 0 评论 -
刷代码随想录有感(120):贪心算法——买卖股票的最佳时机
贪心思路:在左边找一个最小值,通过遍历价格列表,不断更新遇到的最低价格,并计算当前价格与最低价格的差值,如果这个差值大于之前记录的最大利润,则更新最大利润。原创 2024-06-29 20:22:47 · 163 阅读 · 0 评论 -
刷代码随想录有感(119):动态规划——打家劫舍III(树形dp)
使用一个长度为2的数组,记录当前节点偷与不偷所得到的的最大金钱。递归顺序采用后序,即左-右-中,从下往上推。原创 2024-06-27 20:08:45 · 190 阅读 · 0 评论 -
刷代码随想录有感(118):动态规划——打家劫舍II
现在连成环导致首尾都要考虑了,考虑第一个则不考虑最后一个,考虑最后一个则不考虑第一个。所以要限制起始位置和终止位置,其余的都是之前的模板。原创 2024-06-26 11:12:13 · 279 阅读 · 0 评论 -
刷代码随想录有感(117):动态规划——打家劫舍(你需要...“考虑”一下?)
思路:当前房屋偷与不偷取决于 前一个房屋和隔两个房屋的那个是否被偷了。发现当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动规的递推公式。原创 2024-06-25 22:03:16 · 332 阅读 · 0 评论 -
刷代码随想录有感(116):动态规划——单词拆分
很奇怪,这次遍历物品竟然没有到头,而是限制在j长度以内。而且递推公式也不是常规:if(set.find(tmp) != set.end() && dp[i] == true)dp[j]=true原创 2024-06-24 22:38:04 · 347 阅读 · 0 评论 -
刷代码随想录有感(115):动态规划——完全平方数
跟昨天的一样,不过一个细节是i从1开始并且用i * i原创 2024-06-24 10:32:44 · 269 阅读 · 0 评论 -
刷代码随想录有感(114):动态规划——最少数量的零钱换整
既然求最小的,那初始值为INT_MAX;递推公式疑虑:①dp[j] = max(dp[j], dp[j - weight[i]] + value[i])求的是容量为j的背包所装最大价值;②dp[j] = min(dp[j], dp[j-weight[i]] + 1)求的是装满所需最小量;③dp[j] += dp[j - weight[i]]表示满足条件的数量原创 2024-06-23 17:05:38 · 201 阅读 · 0 评论 -
刷代码随想录有感(113):动态规划——爬楼梯plus
跟组合总和IV一样是求排列,比如上3个台阶先1后2和先2后1是不一样的。原创 2024-06-22 19:52:16 · 292 阅读 · 0 评论 -
刷代码随想录有感(112):动态规划——组合总和IV
这题跟零钱凑整有很大不同!!!零钱凑整是组合,这题是排序!题干明确说了“顺序不同的序列视为不同的组合”。所以这题的遍历顺序要变,得先背包再物品, 所以j只能初始化为0了,>=weight[i]只能放到if里面了。原创 2024-06-22 10:57:33 · 297 阅读 · 0 评论 -
刷代码随想录有感(111):动态规划——零钱兑换II
注意题干,到底是求能装最大价值的方案还是装满这个容量共有多少种方法。两种递推公式不同!!!原创 2024-06-21 22:38:43 · 254 阅读 · 0 评论 -
刷代码随想录有感(110):动态规划——完全背包问题
最大的不同就是遍历背包时,是从前向后遍历的。原创 2024-06-21 00:03:47 · 223 阅读 · 0 评论 -
刷代码随想录有感(109):动态规划——01背包问题|一和零
将m, n视为背包的属性,故问题转化为了将m,n容量的背包转满最多能装多少个,而每样物品只能装一次,问题转化成了01背包问题。实际上是三维数组,只不过背包有两个属性而已,用类似是一维数组方法写。原创 2024-06-20 09:44:35 · 240 阅读 · 0 评论 -
刷代码随想录有感(108):动态规划——目标和
递推公式:dp[j] += dp[j - nums[i]]原创 2024-06-19 14:06:32 · 195 阅读 · 0 评论 -
刷代码随想录有感(107):动态规划——01背包/最后一块石头的重量II
思路转化:题干就是要留下来的石头最小,那么就是让石头尽可能分成重量相同的两堆相撞然后什么都不剩,那就转化成了求容量为sum/2的背包最多装多少重量了。原创 2024-06-18 10:14:45 · 167 阅读 · 0 评论 -
刷代码随想录有感(106):动态规划——分割等和子集(01背包问题)
j初始是sum / 2,j >= nums[i](能放选择不放和压根放不了是两码事)。递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i](weight[i] == value[i] == nums[i])定义dp[j]:容量为j的背包所能装下的最大价值,本题则是将容量为sum / 2的背包装满。如果题目给的价值都是正整数那么非0下标都初始化为0就可以了,如果题目给的价值有负数,那么非0下标就要初始化为负无穷。从dp[j]的定义来看,首先dp[0]一定是0。原创 2024-06-17 08:53:35 · 214 阅读 · 1 评论 -
刷代码随想录有感(105):动态规划——01背包问题/一维dp数组(滚动数组)(更优)
同一个题目的两种解法,与二维dp相比,少了for循环初始化过程,另外遍历顺序上下不可颠倒,且0-1背包的j采取从后向前遍历防止物品i被重复放入,从前向后的是完全背包。原创 2024-06-16 11:58:33 · 248 阅读 · 0 评论 -
刷代码随想有感(104):动态规划——01背包问题/二维dp数组
所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);最终结果是dp[2][4],也即:i = weight数组长度减一,j = 包的最大容量。4.所求的目标结果:dp[weight.size() - 1][bagweight]1.定义dp[i][j]:对于背包问题,有一种写法, 是使用二维数组,即。2.递推公式:有两个方向推出来dp[i][j],原创 2024-06-15 17:20:45 · 375 阅读 · 0 评论 -
刷代码随想录有感(103):动态规划——不同的二叉搜索树
不需要考虑节点值的问题,只要看左右节点个数就可以了!原创 2024-06-14 09:55:35 · 135 阅读 · 0 评论 -
动态规划的遍历顺序
从初始化值后面的第一个开始。原创 2024-06-13 14:46:55 · 132 阅读 · 0 评论 -
刷代码随想录有感(102):动态规划——整数拆分
递推公式:①拆成两个:j 和 i - j;②拆成两个以上:j 和 dp[i - j],且dp[i]是dp[i]、j*(i-j)、j*dp[i-j]中的最大值(包括dp[i]的原因是dp[i]不断被更新取最大值),max()一次只能比较两个数。初始化:dp[0]=0、dp[1]=0、dp[2]=1。遍历顺序:从3开始,通过找规律有在i/2之前可拆得最大。dp[i]含义:i这个数被拆分且取乘积的最大值。原创 2024-06-13 14:43:02 · 226 阅读 · 0 评论 -
刷代码随想录有感(101):动态规划——有障碍的最短路径
障碍物之前dp值都是1,之后都是0,遍历时遇到障碍物就跳过(continue)。一切工作都是在没有障碍物的前提下进行的。①如果起点和终点就是障碍物的话直接返回0。原创 2024-06-12 12:32:06 · 164 阅读 · 0 评论 -
刷代码随想录有感(100):动态规划——不同路径
终点为(m-1, n-1)dp数组含义:设定二维数组dp[i][j],代表从(0,0)出发到(i,j)有dp[i][j]种路径。递推公式:由于只能向右/向下,所以(i,j)位置一定来自于左边(i, j-1)或上面(i-1, j),所以dp[i][j]=dp[i-1][j]+dp[i][j-1]。初始化:从(0,0)开始,到(i,0)的dp[i][0]肯定是1,dp[0][j]也一样。dp[i][0]=dp[0][j]。遍历顺序:从(0,0)开始,从上到下i和从左到右j两层循环嵌套。原创 2024-06-11 21:56:52 · 251 阅读 · 0 评论 -
刷代码随想录有感(99):动态规划——使用最小花费爬楼梯
dp[i]含义:到达这个台阶之前已经所花的最小花费。递推公式:dp[i]是dp[i-1]+cost[i-1]与dp[i-2]+cost[i-2]中的较小值。初始化:题干提到可以从下标0或1开始,所以‘站上去’不需要花费,dp[0]=dp[1]=0。遍历顺序:从前向后遍历cost数组。原创 2024-06-10 13:28:34 · 215 阅读 · 0 评论 -
刷代码随想录有感(98):动态规划——爬楼梯
dp大小为n+1?chat的回答是dp数组索引从0开始。其实这题把dp[0]删了也能通过,但一般是默认dp[0]存在的,本题默认dp[0]存在且值为0。原创 2024-06-09 17:58:27 · 408 阅读 · 0 评论 -
刷代码随想录有感(97):动态规划——斐波那契数列
动态规划五部曲:1.dp数组的定义和下标 2.递推公式 3.dp数组如何初始化 4.遍历顺序 5.(出现报错)打印dp数组。还有,要规定dp数组的大小,如vectordp(n+1),不然会报错。原创 2024-06-09 14:11:53 · 333 阅读 · 0 评论 -
刷代码随想录有感(96):贪心算法——小于目标数且是最大的单调递增的数字
贪心思路:从后往前遍历,如果左边比右边大则左边减1,右边变9(最大)。要点②:从后往前遍历而不是从前往后,原创 2024-06-08 14:02:39 · 202 阅读 · 0 评论 -
刷代码随想录有感(95):合并区间
注意到全程参与比较的只有第i位数据和res.back()。重叠,判断右边界是否被囊括(大于则更新),如果不重叠则直接加入res。原创 2024-06-07 18:01:28 · 284 阅读 · 0 评论 -
刷代码随想录有感(94):划分字母区间(怪!)
利用相对位置确定每个字母的最大位置边界,hash[s[i]-'a']=i是点睛之笔。然后不断更新最大右边界直到i到达最大右边界。拿"ababcbaca"来说,{right = max(right, hash[s[i] - 'a']);if(i == right)}用a的最大右边界囊括了b 和 c。原创 2024-06-07 10:16:32 · 155 阅读 · 0 评论