![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 60
Jelly_Believer
这个作者很懒,什么都没留下…
展开
-
leetcode 647回文子串 && 最长回文子串
dp数组:dp[i][j]表示区间i~j之间是否为回文串递推公式:当s[i] == s[j]时,若i == j,则此时肯定为回文子串,dp[i][j] = true;若j - i = 1,则此时也为回文子串,dp[i][j] = true;若j - i > 1,则需要判断i + 1 ~ j-1是否为回文串,即dp[i][j] = dp[i+1][j-1]是否为true;当s[i] != s[j],则 dp[i][j] =false;3.初始化, dp[i][j]初始化为false;...原创 2021-11-27 11:31:23 · 218 阅读 · 0 评论 -
编辑距离讲解。。
dp数组及其下标的含义dp[i][j]表示以i-1结尾的word1和以下标为j-1结尾的word2最近编辑距离确定递推公式if (word1[i - 1] == word2[j - 1]) ,则不用进行任何编辑操作,此时dp[i][j] = dp[i-1][j-1];if (word1[i - 1] != word2[j - 1]),则此时可以进行增删添操作。删除操作:此时删除word1[i-1],则dp[i][j] = dp[i-1][j] + 1(这个+1表示删除操作啦)替换操作: 此...原创 2021-11-26 10:20:11 · 87 阅读 · 0 评论 -
判断子序列 && 不同的子序列
双指针class Solution {public: bool isSubsequence(string s, string t) { int i = 0, j = 0; int res = 0; while(i < s.size() && j < t.size()){ if(s[i] == t[j]){ i++; res++..原创 2021-11-25 17:35:03 · 423 阅读 · 0 评论 -
最长重复子数组 && 最长公共子序列
dp[i][j]:以下标i-1结尾的A和下标j-1结尾的B,最长重复子数组长度为dp[i][j]递推公式:当A[i - 1] == B[j - 1],dp[i][j] = dp[i-1][j-1] + 1,故i和j得从1开始遍历。初始化由dp[i]数组的含义可知,dp[i][0]和dp[0][j]都是没有意义的,但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;所以dp[i][0] 和dp[0][j]初始化为0...原创 2021-11-24 09:48:21 · 562 阅读 · 0 评论 -
最长上升子序列 && 最长连续递增子序列
dp[i]是可以由dp[j](j < i)推导而来的,故实验dynamic programmingdp[i]的定义:dp[i]表示i之前包括i的最长上升子序列的长度。状态转移方程位置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的最大值dp[i]的初始化每一个i..原创 2021-11-24 08:52:45 · 462 阅读 · 0 评论 -
打家劫舍系列
dp[i]数组含义:考虑下标i(包括i)以内的房间,最多可以偷窃的金额为dp[i]注意!:dp[1] = max(nums[0], nums[1])而不是dp[1] = nums[1],因为dp[i]数组的定义是第i个房间能够偷窃到的最大金额class Solution {public: int rob(vector<int>& nums) { if(nums.size() == 1) return nums[0]; if(nums.s..原创 2021-11-23 09:03:08 · 84 阅读 · 0 评论 -
完全背包问题
有N件物品和一个最多能背重量为W的背包,第i件物品的重量为weight[i],价值为value[i]。每件物品都有无限多个(也就是可以放进背包多次),求解将哪些物品放入背包物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。使用一维数组时得先遍历物品再遍历背包,且背包得从大到小遍历,为了防止物品多次放入。而完全背包的物品是可以多次添加的,故要从小到大遍历。//先遍历物品再遍历背包for(int i = 0; i < weight.size(); i++){.原创 2021-11-20 15:21:25 · 746 阅读 · 0 评论 -
leetcode343 整数拆分 && 不同的二叉搜索树
一看题目就知道当前状态肯定是依赖于之前的状态的,故需要使用动态规划。动态规划五部曲:确定dp数组及其下标的含义dp[i]为第i个数字的最大乘积初始化dp数组数字0和1的拆分是没有意义的,故直接只初始化dp[2] = 1确定递推公式dp[i]可以由 j * (i - j) 以及j * dp[i-j]推导而来,这里i的取值为 3 <= i <= n, j的取值为 1<=j < i-1,可以保证i - j > 1,即 (i - j)最小取2故递推公式为dp[i..原创 2021-11-14 18:53:52 · 460 阅读 · 0 评论 -
leetcode 划分为k个相等的子集(回溯)&& 分割等和子集 (dp)&&最后一块石头的重量 && 目标和
选择列表:nums结束条件:k == 4思路:n个数字,每个数字都要选择进入到k个桶中的某一个bool canPartitionKSubsets(vector<int>& nums, int k){ if(k > nums.size()) return false; vector<int> bucket(k, 0); int sum = 0; for(auto v : nums) sum += v; if(sum % k != 0) r原创 2021-07-18 18:32:06 · 190 阅读 · 0 评论 -
Leetcode 39 Combination Sum(组合总和)
@Leetcode本题与Leetcode216 组合总和III以及LeetCode77 Combinations的区别是,集合里面的元素可以重复使用,故递归没有层数限制,只要选取元素总和为target,即可返回。而另外两个知道得递归k层,因为要取k个元素的集合。回溯三步曲递归函数参数void generateSum(vector<int>& candidates, int target, int startIndex, int &sum, vector<int&原创 2021-04-10 10:19:31 · 157 阅读 · 0 评论 -
动态规划问题 按摩师&一和零
给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?int knapsack(int W, vector<int>& wt, vector<int>& val){ //vector全填入0,base case已初始化 vector<vector<int>> dp(N + 1, vector<int>(N+.原创 2021-09-06 16:21:19 · 81 阅读 · 0 评论