动态规划
青衫客36
这个作者很懒,什么都没留下…
展开
-
leetcode-53. 最大子数组和
发现这一类的区间都是包含nums[i]的,所以我们要想在里面找最大值的话,就要让前面那一部分最大,前面这一部分其实就是所有以nums[i - 1]为结尾的区间,最大值为f[i - 1],所以第一类区间的最大值为f[i - 1] + nums[i]f[i]为这两类各自的最大值再取max。定义f[i]是所有以nums[i]为结尾的区间中的最大和,由这个定义出发,我们看看f[i]与f[i-1]有什么递推关系。综上,f[i] = max{nums[i], f[i - 1] + nums[i]}原创 2023-03-21 19:27:42 · 331 阅读 · 0 评论 -
Acwing-4700. 何以包邮?
=========================分割线==============================正解:本题可利用01背包模型,转化为选择若干本书,使得总和不超过sum - x的前提下,总和越大越好。背包容量为sum - x,每个物品的体积为w[i],每个物品的价值为w[i]暴力解法:枚举每本书选或不选,一共2^n种状态,取其中满足要求的最小值即可。不过暴力枚举只能过70%的数据,剩下的就TLE了。也可以用递归进行暴力枚举。原创 2023-01-16 11:00:22 · 143 阅读 · 0 评论 -
Acwing-4645. 选数异或
我们知道与a[i]配对的数是a[i] ^ x,要找到a[i] 左边最靠右的值为a[i] ^ x的数,想去查找某个数的位置的话,我们可以用哈希表,本题a[i]和x都在2^20以内,所以a[i]^x也在2^20以内,所以我们可以开一个数组来存储每个数最靠右的位置,这样的话,f(i)就可以表示出来了,g[i]可以递推出来(时间复杂度是O(n)),g[i] = max{g(i - 1), f(i)}所以,L原创 2023-01-07 22:18:29 · 143 阅读 · 0 评论 -
Acwing-正则表达式匹配
(1)如果p[j+1]不是通配符'*',则f[i][j]是真,当且仅当s[i]可以和p[j]匹配,且f[i+1][j+1]是真;这样做的话,我们发现,f[i][j]除了枚举0个p[j]之外,其余的枚举操作都包含在f[i+1][j]中了,所以我们只需判断。最直观的转移方式是这样的:枚举通配符'*'可以匹配多少个p[j],只要有一种情况可以匹配,则f[i][j]就是真;状态表示:f[i][j]表示p从j开始到结尾,是否能匹配s从i开始到结尾。f[i+1][j]是否为真,以及s[i]是否可以和p[j]匹配即可。转载 2022-11-03 19:34:32 · 81 阅读 · 0 评论 -
Acwing 285. 没有上司的舞会
【代码】Acwing 285. 没有上司的舞会。原创 2022-09-29 10:53:00 · 142 阅读 · 0 评论 -
Acwing 91. 最短Hamilton路径
状态表示: f[i][j]表示所有从0走到j,走过的所有点是i的所有路径 中的最小值。状态计算:以倒数第二个点来划分集合。原创 2022-09-29 10:07:10 · 81 阅读 · 0 评论 -
Acwing 901. 滑雪
状态表示:f[i][j]表示所有从(i, j)开始滑的路径中的最大值。状态计算:按照第一步是向哪个方向滑的,将集合划分为四个部分。原创 2022-09-29 09:45:00 · 156 阅读 · 0 评论 -
Acwing 900. 整数划分
状态表示:f[i][j]表示从1~i中选,总体积恰好是j的选法的数量。f[i][j] 表示前i个整数(1,2…,i)恰好拼成j的方案数。状态计算:对应集合的划分,根据第i个物品选择了几个来划分。求方案数:把集合选0个i,1个i,2个i,…(这一步类似完全背包的推导)原创 2022-09-28 19:38:12 · 179 阅读 · 0 评论 -
Acwing 899. 编辑距离
本题与最短编辑距离类似,只不过是多了判断是否满足在操作次数上限内,是否可以变成相应的字符串,逐个遍历求解即可。原创 2022-09-28 15:48:58 · 162 阅读 · 0 评论 -
Acwing 902. 最短编辑距离
b[j],修改前保证a的前i-1个字符与b的前j-1个字符相匹配,然后添加一步修改操作。(3)修改一个字符:① 若a[i] = b[j],则无需修改,只需保证a的前i-1个字符与b的前j-1个字符相匹配。(1)删除一个字符:删除之前需要保证a的前i-1个字符与b的前j个字符相匹配,然后再增加一步删除操作。(2)增加一个字符:增加之前需要保证a的前i个字符与b的前j-1个字符相匹配,然后再增加一步添加操作。原创 2022-09-28 15:06:45 · 97 阅读 · 0 评论 -
Acwing 291. 蒙德里安的梦想
总共m列,我们假设列下标从0开始,即第0列,第1列……假设此时对应的状态是k(第i-2列到第i-1列伸出来的二进制数,比如00100),k也是一个二进制数,1表示哪几行小方块是横着伸出来的,0表示哪几行不是横着伸出来的。既然从第i-1列到第i列横着摆的,和第i-2列到第i-1列横着摆的都确定了,那么第i-1列 空着的格子就确定了,这些空着的格子将来用作竖着放。首先==k不能和 j在同一行==:因为从i-1列到第i列是横着摆放的12的方块,那么i-2列到i-1列就不能是横着摆放的,否则就是1 3的方块了!转载 2022-09-25 22:05:39 · 215 阅读 · 0 评论 -
Acwing 896. 最长上升子序列 II
总体使得栈中的元素单调递增排列。原创 2022-09-23 11:07:59 · 109 阅读 · 0 评论 -
Acwing 282. 石子合并
注:当区间长度为1时(即len = 1),区间不需要合并,代价是0,因为f是全局数组,所以len可以从2开始循环。f[i][j]表示将所有第i堆石子到第j堆石子合并成一堆石子的合并方式,这些方式中代价的最小值。每一类的最小代价 = 左边的最小代价 + 右边的最小代价 + 最后一步的代价。我们可以以最后一次合并的分界线来划分集合。最后对每一类的最小代价取最小值。原创 2022-09-22 19:46:51 · 208 阅读 · 0 评论 -
Acwing 897. 最长公共子序列
f[i][j]表示所有在第一个序列的前i个字母中出现,且在第二个序列的前j个字母中出现的子序列中的最大个数。原创 2022-09-22 16:59:54 · 110 阅读 · 0 评论 -
Acwing 895. 最长上升子序列
f[i]表示所有以第i个数结尾的上升子序列中的最大个数。原创 2022-09-22 16:00:09 · 66 阅读 · 0 评论 -
Acwing 898. 数字三角形
注意边界情况,边界初始化为-INF,在三角形的外面一层也要初始化为INF,因为边界上的元素左上方或者正上方可能没有值,必须安排上-INF(hh~)f[i][j]表示所有从起点开始,走到(i, j)的路径中的和的最大值。自上而下到达(i, j)有两种路径,一个是左上方,一个是正上方。原创 2022-09-22 15:26:00 · 89 阅读 · 0 评论 -
Acwing 9. 分组背包问题
因为每组中的物品选或者不选,可用类似于0/1背包优化的方式,使用滚动数据,倒循环优化。f[i][j]表示只从前i组物品中选且总体积不大于j的所有选法中的最大值。分组背包,每组最多只能选择其中的一种物品。原创 2022-09-22 10:37:56 · 80 阅读 · 0 评论 -
Acwing 5. 多重背包问题 II
答案是否定的,因为完全背包中的物品有无限个,而多重背包中的物品是有限个,两个公式不能进行合并(有点级数的意思?),也就是说,max函数不能通过总体的最大值减去最后一项的最大值得到前面的最大值。本题朴素做法与完全背包类似,那么优化解法是不是也可以借鉴完全背包那样呢?此处采用二进制优化多重背包,将优化后的多重背包视为0/1背包进行求解。原创 2022-09-22 09:58:42 · 156 阅读 · 0 评论 -
Acwing 4. 多重背包问题 I
朴素解法与完全背包问题很类似。原创 2022-09-22 09:39:33 · 90 阅读 · 0 评论 -
Acwing 3. 完全背包问题
滚动数组优化,此处j循环从v[i]到m即可,无需倒循环,因为此处就是要计算f[i][j - v[i]]而不是0/1背包中的f[i - 1][j - v[i]]。原创 2022-09-21 22:02:34 · 313 阅读 · 0 评论 -
Acwing 2. 01背包问题
采用滚动数组优化时,f[j - v[i]] 是前i - 1个(f[i - 1][j - v[i]])的选法,如果j循环从v[i]到m, 则会在计算f[j]之前算出来,此时f[j - v[i]]表示的是前i个(f[i][j - v[i]])的选法,是错误的,所以,应该将j循环从m倒循环到v[i],确保f[j - v[i]]在计算f[j]之前没有被修改过。f[i][j]表示从前i个物品选,总体积原创 2022-09-21 21:12:35 · 155 阅读 · 0 评论