动态规划
文章平均质量分 78
哈哈哈~哈哈哈
这个作者很懒,什么都没留下…
展开
-
BM65 最长公共子序列(二)
题目要求获取最长公共子序列,我们肯定要先知道最长到底是多长,因此肯定要先求最长公共子序列的长度,然后根据这个长度获取这个子序列。(注意:子序列不是子串,子串要求所有字符必须连续,子序列不要求连续,只要求相对位置不变)给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列。原创 2023-09-16 16:05:41 · 56 阅读 · 0 评论 -
回文子串问题(dp)
给你一个字符串 ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。暴力解法:判断j到i指向的字符串是否是回文的动规五部曲:1.确定dp数组(dp table)以及下标的含义看回文串的性质。 如图:在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4原创 2023-09-10 16:20:00 · 54 阅读 · 0 评论 -
编辑距离问题(动态规划)
给你两个单词word1和word2请返回将word1转换成word2所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符3horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')原创 2023-09-10 15:32:01 · 34 阅读 · 0 评论 -
子序列问题
而是dp[6]。在回顾一下dp[i]的定义:包括下标i之前的最大连续子序列和为dp[i]。那么要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列。所以在递推公式的时候,可以直接选出最大的dp[i]。原创 2023-09-10 15:15:24 · 43 阅读 · 0 评论 -
最长子序列问题
dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如何算递增呢。原创 2023-09-09 18:20:50 · 33 阅读 · 0 评论 -
买卖股票问题第二部分
代码随想录 (programmercarl.com)原创 2023-09-09 18:03:43 · 30 阅读 · 0 评论 -
买卖股票问题第一部分
给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择买入这只股票,并选择在卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。原创 2023-09-09 17:22:31 · 26 阅读 · 0 评论 -
打家劫舍问题
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,一夜之内能够偷窃到的最高金额。原创 2023-09-09 10:52:37 · 30 阅读 · 0 评论 -
多重背包问题
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。毫无区别,这就转成了一个01背包问题了,且每个物品只用一次。多重背包和01背包是非常像的, 为什么和01背包像呢?问背包能背的物品最大价值是多少?背包最大重量为10。和如下情况有区别么?原创 2023-09-09 10:34:49 · 29 阅读 · 0 评论 -
139. 单词拆分
给你一个字符串s和一个字符串列表wordDict作为字典。请你判断是否可以利用字典中出现的单词拼接出s。不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包!原创 2023-09-09 10:32:08 · 224 阅读 · 0 评论 -
279. 完全平方数
给你一个整数n,返回和为n的完全平方数的最少数量。是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149和16都是完全平方数,而3和11不是。原创 2023-09-09 09:55:38 · 30 阅读 · 0 评论 -
322. 零钱兑换
给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。原创 2023-09-09 09:36:28 · 26 阅读 · 0 评论 -
377. 组合总和 Ⅳ
给你一个由整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合 32 位整数范围。原创 2023-09-07 21:07:07 · 36 阅读 · 0 评论 -
518. 零钱兑换 II
难点在于遍历顺序!在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。代码随想录 (programmercarl.com)原创 2023-09-07 20:35:44 · 30 阅读 · 0 评论 -
完全背包理论基础
因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。只要保证下标j之前的dp[j]都是经过计算的就可以了。有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。我们知道01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。,求解将哪些物品装入背包里物品价值总和最大。原创 2023-09-07 17:47:39 · 76 阅读 · 0 评论 -
474. 一和零
纯 0 - 1 背包 (opens new window)是求 给定背包容量 装满背包 的最大价值是多少。416. 分割等和子集 (opens new window)是求 给定背包容量,能不能装满这个背包。1049. 最后一块石头的重量 II (opens new window)是求 给定背包容量,尽可能装,最多能装多少494. 目标和 (opens new window)是求 给定背包容量,装满背包有多少种方法。本题是求 给定背包容量,装满背包最多有多少个物品。原创 2023-09-07 17:27:23 · 30 阅读 · 0 评论 -
494. 目标和
给你一个非负整数数组nums和一个整数target。向数组中的每个整数前添加'+'或'-',然后串联起所有整数,可以构造一个2'+'1'-'"+2-1"返回可以通过上述方法构造的、运算结果等于target的不同的数目。转化为01背包问题:假设加法的总和为x,那么减法对应的总和就是sum - x。所以我们要求的是 x - (sum - x) = target。这里的x,就是bagSize,也就是我们后面要求的背包容量。同时如果 S的绝对值已经大于sum,那么也是没有方案的。为什么是01背包呢?原创 2023-09-07 17:07:12 · 37 阅读 · 0 评论 -
1049. 最后一块石头的重量 II
本题其实和416. 分割等和子集 (opens new window)几乎是一样的,只是最后对dp[target]的处理方式不同。416. 分割等和子集 (opens new window)相当于是求背包是否正好装满,而本题是求背包最多能装多少。代码随想录 (programmercarl.com)原创 2023-09-07 16:46:18 · 30 阅读 · 0 评论 -
416. 分割等和子集
01背包相对于本题,主要要理解,题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。代码随想录 (programmercarl.com)原创 2023-09-07 16:36:55 · 36 阅读 · 0 评论 -
01背包问题
在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。原创 2023-09-07 16:23:05 · 29 阅读 · 0 评论 -
96. 不同的二叉搜索树
给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的有多少种?返回满足题意的二叉搜索树的种数。来看看n为3的时候,有哪几种情况。当1为头结点的时候,其右子树有两个节点,看这两个节点的布局,和 n 为2的时候两棵树的布局是一样的当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,和n为2的时候两棵树的布局也是一样的当2为头结点的时候,其左右子树都只有一个节点,布局和n为1的时候只有一棵树的布局也是一样的。原创 2023-09-07 15:36:12 · 28 阅读 · 0 评论 -
343. 整数拆分
对于正整数 n,当 n≥2n\ge 2n≥2 时,可以拆分成至少两个正整数的和。令 x 是拆分出的第一个正整数,则剩下的部分是 n−x,n−x可以不继续拆分,或者继续拆分成至少两个正整数的和。由于每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积,因此可以使用动态规划求解。创建数组 dp,其中 dp[i] 表示将正整数 i拆分成至少两个正整数的和之后,这些正整数的最大乘积。特别地,0不是正整数,1是最小的正整数,0和 1都不能拆分,因此 dp[0]=dp[1]=0。),并使这些整数的乘积最大化。原创 2023-09-07 15:19:07 · 32 阅读 · 0 评论 -
63. 不同路径 II
本题是62.不同路径 (opens new window)的障碍版,整体思路大体一致。但就算是做过62.不同路径,在做本题也会有感觉遇到障碍无从下手。其实只要考虑到,遇到障碍dp[i][j]保持0就可以了。也有一些小细节,例如:初始化的部分,很容易忽略了障碍之后应该都是0的情况。代码随想录 (programmercarl.com)原创 2023-09-06 20:43:28 · 29 阅读 · 0 评论 -
62. 不同路径
一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?原创 2023-09-06 09:40:49 · 29 阅读 · 0 评论 -
BM64 最小花费爬楼梯
给定一个整数数组 cost ,其中cost[i] 是从楼梯第i 个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。动态规划五部曲: 1.确定dp数组以及下标的含义本题只需要一个一维数组dp[i]就可以了。dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。dp[i - 1原创 2023-09-06 09:25:05 · 33 阅读 · 0 评论 -
BM63 跳台阶
所以:不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。所以dp[i] = dp[i - 1] + dp[i - 2]。还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。从递推公式dp[i] = dp[i - 1] + dp[i - 2];原创 2023-09-06 09:12:23 · 40 阅读 · 0 评论 -
BM62 斐波那契数列
【代码】BM62 斐波那契数列。原创 2023-09-06 09:02:55 · 37 阅读 · 0 评论