算法:DP
文章平均质量分 77
动态规划算法题
拾牙慧者
会点c++、python;
展开
-
《dp补卡——子序列问题》
300. 最长递增子序列 step1:dp[i]:下标<=i的最长子序列长度。即以 nums[i] 结尾 的「上升子序列」的长度,注意以nums[nums.size()-1]结尾的上升子序列长度并不一定是全局最优值,所以要从dp[i]中找到最大值。 step2:状态转移方程: if(nums[i] > nums[j]) dp[i] = max(dp[i],dp[j]+1); //取得dp[j]+1中最大的那个值作为dp[i] step3:初始化 每一个i,至少都是1. step4:遍历顺序,从原创 2021-04-25 22:54:58 · 262 阅读 · 0 评论 -
《dp补卡——买卖股票问题》
目录121. 买卖股票的最佳时机贪心dp思路滚动数组优化122. 买卖股票的最佳时机 II123. 买卖股票的最佳时机 III188. 买卖股票的最佳时机 IV309. 最佳买卖股票时机含冷冻期714. 买卖股票的最佳时机含手续费 121. 买卖股票的最佳时机 贪心 取最左最小值,取最右最大值,差值为最大利润 class Solution { public: int maxProfit(vector<int>& prices) { int n = prices.s原创 2021-04-25 14:16:00 · 224 阅读 · 0 评论 -
《dp补卡——多重背包》
多重背包简介: 有N种物品和一个容量为V的背包。第i种物品最多有Mi件可用,每件耗费的空间为Ci,价值为Wi。求解将哪些物品装入背包可使得这些物品耗费的空间总和不超过背包容量,且价值总和最大。 将Mi件摊开,就是一个01背包问题。 如下列两表就是等价的,图来源于代码随想录。 void test_multi_pack() { vector<int> weight = {1,3,4}; vector<int> value = {15,20,30}; vecto原创 2021-04-24 19:20:30 · 200 阅读 · 0 评论 -
《dp补卡——完全背包问题》
N件物品和一个最多能背重量为W的背包。第i件物品的重量为weight[i],得到的价值是value[i]。每件物品都有无限个(可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 01背包和完全背包唯一不同在于遍历顺序上。 01背包的核心代码: for(int i = 0; i < weight.size(); i++) //遍历物品 { for(int j = bagWeight; j >= weight[i]; j--) //遍历背包容量 { dp.原创 2021-04-24 18:58:38 · 252 阅读 · 0 评论 -
《dp补卡——01背包问题》
01背包 1、dp数组以及下标含义 dp[i][j]标识从下标为[0,1]的物品里任意取,放进容量为j的背包,价值总和最大是多少? 2、确定递推公式 dp[i][j]可以由两个方向推出: 1、dp[i-1][j],背包容量为j,里面不放入物品i的最大价值,此时dp[i][j] = dp[i-1][j] 2、dp[i-1][i-weight[i]]推出,背包容量为i-weight[i]的时候此时dp[i][j] = dp[i-1][j-weight[i]]+valuep[i]; 所以递推公式为: dp[i.原创 2021-04-23 17:22:22 · 281 阅读 · 0 评论 -
《dp补卡——343. 整数拆分、96. 不同的二叉搜索树》
343. 整数拆分 1、确定dp数组以及下标含义。 dp[i]:分拆数字i,可以得到的最大的乘积 2、确定递推公式: dp[i]最大乘积出处:从1遍历j到i,j * dp[i-j] 与 j * (i-j)取最大值。( 拆分j的情况,在遍历j的过程中dp[i - j]其实都计算过了 ) 所以递推公式为: dp[i] =max(dp[i],max(j*(i-j),j*dp[i-j])); 3、dp的初始化 dp[0] = dp[1] = 0; dp[2] = 1; 4、确定遍历顺序 由于递推公式,dp[i]是原创 2021-04-23 12:57:56 · 171 阅读 · 0 评论 -
leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)
前三种思路都是按照列来算,单调栈是按照行来计算的。 所以单调栈的方法并不好理解,还需巩固。原创 2020-12-12 12:13:23 · 290 阅读 · 0 评论 -
leetcode 322. 零钱兑换 思考分析
关键词:动态规划、自底向上 可联系eetcode 39. 组合总和,一起思考,并且做区分。 一个是求所有解的集合,一个是求最优解原创 2020-11-27 19:07:50 · 271 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列 (从重叠子问题到备忘录到dp数组迭代解法)
斐波那契数列求解方法: 1、暴力递归,含有大量冗余计算,时间复杂度O(2^n) 2、备忘录递归解ordp动态规划,可以将时间复杂度降为O(n) 3、滚动数组优化,将空间复杂度由O(n)降低至O(1)原创 2020-11-24 21:39:40 · 349 阅读 · 0 评论 -
leetcode 198. 打家劫舍 思考分析
本笔记记录了刷力扣198题的思路和代码。 核心:动态规划+滚动数组优化。原创 2020-11-18 11:27:37 · 250 阅读 · 0 评论 -
LeetCode 3:无重复字符的最长子串 思考分析
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3: 输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。 动态规划解 .原创 2020-10-06 14:29:22 · 214 阅读 · 0 评论 -
LeetCode 121:买卖股票的最佳时机 思考分析
题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。 示例 2.原创 2020-10-05 19:49:55 · 161 阅读 · 0 评论 -
LeetCode 53:最大子序和解题以及优化思路(第一次独立刷题记录)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。 看着有点像我之前整理的一道题目:乘积最大子数组 https://blog.csdn.net/qq_42604176/article/details/108876793 先用DP试试: .原创 2020-10-03 21:20:44 · 233 阅读 · 0 评论 -
dp笔记:关于DP算法和滚动数组优化的思考
从网上总结了一些dp的套路以及对滚动数组的一些思考,现记录如下,希望以后回顾此类算法时会有所帮助。 DP算法经验 1、DP算法核心: 1、确定【DP状态】 2、确定【DP状态转移方程】 其中DP状态又需要考虑到两点: 1、最优子结构 将原有问题化为一个个子问题,即子结构。对于每一个子问题,其最优值均由【更小规模的子问题的最优值】推导过来 2、无后效性 我们只关心子问题的最优值,不关心子问题的最优值是怎样的得到的。 2、DP算法类别以及例题 滚动数组优化与背包问题 1、01背包问题 一共有N件物品,从第i(i原创 2020-10-01 11:00:04 · 1301 阅读 · 0 评论
分享