动态规划
文章平均质量分 88
dp
Powerstot
热爱仅仅只是热爱
展开
-
dp:回文子串,回文子序列
回文子串https://leetcode-cn.com/problems/palindromic-substrings/给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。思路法1:暴力,遍历区间起始位置和终止位置,判断是否为回文串,时间复杂度O(n^3)法2:dpdp[i][j]表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。推导分情原创 2021-04-20 20:54:56 · 548 阅读 · 0 评论 -
dp:子序列,最长递增子序列,最长连续递增子序列,最长重复子数组,最长公共子序列
最长重复子序列https://leetcode-cn.com/problems/longest-increasing-subsequence/给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长原创 2021-04-20 16:10:26 · 299 阅读 · 0 评论 -
dp:编辑距离
判断子序列https://leetcode-cn.com/problems/is-subsequence/给定字符串 s 和 t ,判断 s 是否为 t 的子序列。思路此题相当于只有删除操作的编辑距离dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。if (s[i - 1] == t[j - 1])t中找到了一个字符在s中也出现了if (s[i - 1] != t[j - 1])相当于t要删除元素,继续匹配dp[i]原创 2021-04-19 22:56:45 · 177 阅读 · 0 评论 -
dp:股票系列I II III IV 含冷冻期 含手续费
买卖股票的最佳时机https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5原创 2021-04-12 20:23:50 · 246 阅读 · 0 评论 -
dp:打家劫舍123,环形数组,树形dp
打家劫舍198.打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:原创 2021-04-07 21:31:10 · 274 阅读 · 0 评论 -
背包总结:01背包,完全背包,多重背包
不同背包定义01背包:每个物品数量唯一完全背包:每个物品数量无限多重背包:不同物品数量不同解题思路确定是否为背包问题,即有物品重量,价值,背包容量确定背包容量,每个 物品的重量,价值确定 物品数量/背包类型 为 1(01背包)、无限(完全背包)确定题目问题,找到对应递推公式,初始化、确定遍历顺序特判递推公式能否装满背包(最多能装多少):dp[j] = max(dp[j],dp[j-nuims[i]]+nums[i])如:石头碰撞(最后剩下石头数),分割等和子集(分割两个子串使其原创 2021-04-06 21:52:12 · 357 阅读 · 0 评论 -
dp:完全背包,零钱兑换,零钱兑换II
完全背包N个物品,背包容量为M的背包,每个物品的重量weight[i],价值value[i],每个物品都有无限个,求装满背包的最大价值思路和01背包不一样的地方就遍历顺序,01背包中,为了防止一个物品被多次装入背包,所以背包容量是倒序遍历,而在完全背包中,物品是可以多次放入的,所以只需将背包容量遍历顺序改成正序遍历即可。在01背包中,是必须要先遍历物品再遍历背包容量的如果先遍历背包容量,在遍历物品,背包里就只会放入一个物品,因为要取 j 容量下的最大价值,所以循环完 i 个物品只会放入最优的一个原创 2021-04-06 19:31:01 · 189 阅读 · 0 评论 -
dp:01背包,目标和,一和零
目标和494. 目标和给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例:输入:nums: [1, 1, 1, 1, 1], S: 3 输出:5 解释:-1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3一共有5种方原创 2021-04-03 21:07:23 · 237 阅读 · 0 评论 -
dp:01背包,分割等和子集,最后一块石头的重量 II
01背包模板01背包问题:有N件物品,和一个最多能背W重量的背包,第i件物品的重量是weight[i],得到的价值是value[i],每件物品只能使用一次,求将那些物品装入背包价值最大二维数组写法思路确定dp数组及其下标含义:dp[i][j]表示,从下标为0-i的物品里任意取,放进容量为j的背包,最大的价值总和推导dp方程:每件物品有两种选择:装进背包:dp[i-1][j-weight[i]]+value[i],背包减去该物品的重量再加上该物品的价值不装进背包:dp[i-1][j] 不装,原创 2021-04-01 22:51:40 · 133 阅读 · 0 评论 -
dp:整数拆分,不同的搜索二叉树
整数拆分343. 整数拆分给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。示例 1: 输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。思路确定dp数组含义:dp[i]为拆分i的乘积最大值推导dp方程:假设拆分出来的数字为j,1<j<i,原创 2021-03-30 18:16:48 · 264 阅读 · 0 评论