摘要: LC647. 回文子串 动态规划法: **遍历顺序:**从下往上,从左往右 当s[i]与s[j]相等时,需要考虑三种情况: 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 情况二:下标i 与 j相差为1,例如aa,也是回文子串 情况三:下标:i 与 j 相差大于1的时候,例如cabac 阅读全文
posted @ 2023-03-15 13:53 冥紫将 阅读(40) 评论(0) 推荐(0)
摘要: LC583. 两个字符串的删除操作 简单题学方法,困难题用方法 实现了Carl哥题解中说的第二种动态规划,和“LC1143.最长公共子序列”基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删 阅读全文
posted @ 2023-03-15 13:50 冥紫将 阅读(33) 评论(0) 推荐(0)
摘要: LC392. 判断子序列 简单题学方法,困难题用方法 bool isSubsequence(string s, string t) { int size_s = s.size(); int size_t = t.size(); vector<vector<int>> dp(size_s + 1, v 阅读全文
posted @ 2023-03-15 13:48 冥紫将 阅读(39) 评论(0) 推荐(0)
摘要: LC1143. 最长公共子序列 相对于“LC718. 最长重复子数组”,那道题是要求连续的子序列,所以出现不相等的情况时,对当前格子赋0即可。而本题不要求连续,所以不能直接赋零,而是保持跟前面一个格子值一致或者保持跟上一层同位置一样的值(两者比较大小)。 dp[i]含义:对text2数组,以下标为 阅读全文
posted @ 2023-03-15 13:44 冥紫将 阅读(35) 评论(0) 推荐(0)
摘要: LC300. 最长递增子序列 dp[i]含义:i 之前包括 i 的以nums[i]结尾的最长递增子序列的长度 int lengthOfLIS(vector<int>& nums) { int size = nums.size(); vector<int> dp(size, 1); int maxLe 阅读全文
posted @ 2023-03-15 13:39 冥紫将 阅读(46) 评论(0) 推荐(0)
摘要: LC309. 最佳买卖股票时机含冷冻期 更多的状态转移: dp[i] [0]含义:持有股票的最多现金 分两种情况,一是昨天就持有,即dp[i - 1] [0]。二是昨天没持有(可能是昨天抛出了,或者是昨天之前更早抛出了),所以今天若要买新的股票,则起码要用前天抛出股票时剩的现金来购买,即 dp[i 阅读全文
posted @ 2023-03-15 13:36 冥紫将 阅读(35) 评论(0) 推荐(0)
摘要: LC123. 买卖股票的最佳时机Ⅲ 更多的状态转移: dp[i] [0]含义:第一次持有股票的最多现金 dp[i] [1]含义:第一次不持有股票的最多现金 dp[i] [2]含义:第二次持有股票的最多现金 dp[i] [3]含义:第二次不持有股票的最多现金 ////自写的一般实现方法 int max 阅读全文
posted @ 2023-03-15 13:34 冥紫将 阅读(40) 评论(0) 推荐(0)
摘要: LC121. 买卖股票的最佳时机 ////自写的一般实现方法 int maxProfit(vector<int>& prices) { int purchase = prices[0]; int maxProfit = 0; int todayProfit = 0; for (int i = 1; 阅读全文
posted @ 2023-03-15 13:31 冥紫将 阅读(46) 评论(0) 推荐(0)
摘要: LC198. 打家劫舍 自己写的版本,用pair<不取本次的最大收获, 取本次的最大收获>进行记录 int rob(vector<int>& nums) { int size = nums.size(); vector<pair<int, int>> dp(size); dp[0] = pair<i 阅读全文
posted @ 2023-03-15 13:28 冥紫将 阅读(34) 评论(0) 推荐(0)
摘要: LC70. 爬楼梯 原题其实是一道简单动规的题目。但其实本题稍加改动就是一道面试好题。 如改为:一步一个台阶,两个台阶,三个台阶,.......,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢? 1阶,2阶,.... m阶就是物品,楼顶就是背包。每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶 阅读全文
posted @ 2023-03-15 13:23 冥紫将 阅读(20) 评论(0) 推荐(0)
摘要: LC518. 零钱兑换Ⅱ 刚开始一气写成,没想到犯了个那么傻×的毛病 class Solution { public: int change(int amount, vector<int>& coins) { int size = coins.size(); vector<int> dp(amoun 阅读全文
posted @ 2023-03-15 13:21 冥紫将 阅读(34) 评论(0) 推荐(0)
摘要: 01背包的应用 分割等和子集: 给一个weight的背包,尽量往里塞满,如果有刚刚塞满的组合,则返回true。问的是是否存在刚刚好塞满weight背包的组合。 最后一块石头的重量Ⅱ: 给一个weight的背包,尽量往里塞满,若能刚刚塞满,说明最后剩的一块石头重量为0(即不剩了)。 目标和:这道题就有 阅读全文
posted @ 2023-03-15 13:14 冥紫将 阅读(35) 评论(0) 推荐(0)
摘要: 动态规划五部曲 确定dp[i]的含义 dp递推公式 dp数组如何初始化 确认dp数组遍历顺序 打印dp数组,主要用于调试 LC416. 分割等和子集 这道题是“背包问题”的应用,但其实不好看出来。 dp[i]的含义和递推公式 与 01背包问题一致。 这道题的dp数组中,物品的weight即为价值 注 阅读全文
posted @ 2023-03-15 13:08 冥紫将 阅读(25) 评论(0) 推荐(0)
摘要: 动态规划五部曲 确定dp[i]的含义 dp递推公式 dp数组如何初始化 确认dp数组遍历顺序 打印dp数组,主要用于调试 LC343. 整数拆分 dp[i]含义:数字 i 被拆解后的最大乘积 递推公式:对多组dp[i] * [i - j] 求最大值 dp数组初始化:dp[1] = 1; dp[2] 阅读全文
posted @ 2023-03-15 13:07 冥紫将 阅读(26) 评论(0) 推荐(0)
摘要: 动态规划五部曲 确定dp[i]的含义 dp递推公式 dp数组如何初始化 确认dp数组遍历顺序 打印dp数组,主要用于调试 LC62. 不同路径 dp[i] [j]含义:到达格子(i, j)中有dp[i] [j]种方法 递推公式:dp[i] [j] = dp[i] [j - 1] + dp[i - 1 阅读全文
posted @ 2023-03-15 13:06 冥紫将 阅读(42) 评论(0) 推荐(0)