![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 66
Suryxin.
Suryxin.cn
展开
-
leetcode 1937. 扣分后的最大得分「动态规划」「拆项」
leetcode 1937. 扣分后的最大得分「动态规划」「拆项」原创 2024-07-24 22:07:53 · 1043 阅读 · 0 评论 -
leetcode 174. 地下城游戏「动态规划」「逆向思维」
leetcode 174. 地下城游戏「动态规划」「逆向思维」原创 2024-07-18 16:01:15 · 1230 阅读 · 0 评论 -
【代码源每日一题Div1】#665. 数组划分「位运算贪心+动态规划」
【代码源每日一题Div1】#665. 数组划分「位运算贪心+动态规划」原创 2022-11-24 18:15:27 · 593 阅读 · 0 评论 -
【代码源每日一题Div1】路径计数2「动态规划 记忆化搜索」
【代码源每日一题Div1】路径计数2「动态规划 记忆化搜索」原创 2022-11-10 00:27:31 · 472 阅读 · 0 评论 -
ARC133 B - Dividing Subsequence
B - Dividing Subsequence题目描述:两个序列ar,br,分别选择k个数,满足br[i] % ar[i] == 0, 1<= i <= k,问k最大是多少思路:类似于最长公共子序列,不过最长公共子序列满足的是ar[i] = br[i],而这里满足的是br[i] % ar[i] == 0最长公共子序列的做法是将br的每个数字映射到ar中相同的数字的位置的下标,然后求一次最长上升子序列这个题也差不多,一个br[i]能对应很多个下标,这个我们可以处理出来,时间大概原创 2022-05-18 14:26:55 · 248 阅读 · 0 评论 -
Lemonade Trade「dp + 对数优化」
Lemonade Trade题目描述:你有一升粉色饮料,想换取蓝色饮料有n个商人,每个商人可以将1升b饮料换成p升a饮料,p是汇率,只能从1到n顺次访问商人,到每个商人的地方可以选择换或不换,换的量也可以任意,不可以回头问最多能获得多少蓝色的饮料,如果能换的蓝色饮料大于10升,则输出10即可思路:一眼DP设dp[i]表示能换出i的饮料的体积的最大值则对于一个商人,假设1升a可以换p升b,dp[b] = max(dp[b], dp[a] * p)但是如果都是大于1的汇率,很快就会乘爆,原创 2022-05-17 21:45:44 · 157 阅读 · 0 评论 -
L3-2 拼题A打卡奖励 (30 分)「01背包优化」
L3-2 拼题A打卡奖励 (30 分)题目描述:n张卡片,每张卡片有一个花费cost,一个价值val,你现在有m块钱,问最多能获得多大的价值n <= 1000, m <= 365×24×60, cost <= 600, val <= 30思路:观察一下数据范围,发现普通的01背包复杂度是n*m,大概是5e8,会超时,我们得想办法优化一下可以发现,每个卡片的价值其实不高,所以我们可以考虑交换价值和体积,将dp的第二维改成所有卡片的价值,这样的复杂度是1000 * (1原创 2022-04-19 22:38:07 · 288 阅读 · 0 评论 -
AtCoder Beginner Contest 210 D - National Railway「矩阵dp」
AtCoder Beginner Contest 210D - National Railway题目描述:给你一个矩阵,每个点都有一个权值,如果这个点被选择,则需要付出他的权值,你需要选择两个不同的点(任意选),在这两个点之间建一条边,边的花费是两点的曼哈顿距离乘以c,问点权和边权和最小是多少思路:这个题是一个非常非常妙的dp,abc的dp真的会给人眼前一亮的感觉显然,最暴力方法是 O(n4)O(n^4)O(n4),也就是暴力枚举两个点计算最小答案,但这毫无疑问会TLE,所以我们可以考虑进原创 2022-04-18 21:25:14 · 236 阅读 · 0 评论 -
AtCoder Beginner Contest 248 C - Dice Sum 「二维费用背包的计数问题」
C - Dice Sum题目描述:问存在多少种序列A,满足如下的条件:长度为nA[i] <= m∑i=1nA[i]<=K\sum_{i=1}^{n}{A[i]}<=K∑i=1nA[i]<=K思路:我们可以把他看成一个二维费用的背包问题每个物品的体积是1,重量是i,背包的总体积是n,承载重量是K问的是方案数dp[j][k]表示当前体积是j,用了k的重量的方案数状态转移方程: dp[j][k]+=dp[j−1][k−i]dp[j][k] += dp[j原创 2022-04-18 17:55:24 · 415 阅读 · 0 评论 -
L3-025 那就别担心了 (30 分)「记忆化搜索」
L3-025 那就别担心了 (30 分)题目描述:有向无环图,起点x,终点y,问起点到终点有多少条路径,问是不是从x出发的所有路径都会指向一个无法往下走的点,即y思路:有向无环图,第一反应就是拓扑排序,但是怎么写都过不去,因为无法确定到底是不是"逻辑自洽"正解:记忆化搜索直接爆搜求路径,初始化是给num[y] = 1,然后去dfs(x),相当于倒着推,这样我们只需要判断是否存在某些点来过,且num ==0#include <bits/stdc++.h>using name原创 2022-04-14 18:47:06 · 325 阅读 · 0 评论 -
AtCoder - arc070_D - No Need 「二分答案 + dp check」
D - No Need题目描述:n个数字,求有多少个数是不必要的数字不必要数x的定义是:对于所有包含x序列、且序列和大于等于k的子序列,我们删掉x后,序列和仍然大于等于k,则x是不必要的思路:最简单的思路就是一个O(n2k)O(n^2k)O(n2k)的暴力枚举 + dp判断但是显然会T飞所以我们观察一下以后,发现从小到大排序以后,不必要数一定是一个前缀,也就是满足单调性所以我们可以使用二分答案 + dp的check#include <bits/stdc++.h>us原创 2022-04-11 19:56:07 · 494 阅读 · 0 评论 -
abc147_E - Balanced Path「dp」
E - Balanced Path题目描述:n * m的矩阵,每个矩阵上有两个值,一个a,一个b,这个点的价值是a-b或者是b-a,问从(1, 1)走到(n, m)的路径中能得到的总价值的绝对值最小是多少思路:设dp[i][j][k]表示从(1, 1)走到(i, j)后的总价值是否能为k,如果为1,则能为k,否则则不能就类似于最简单的方格取数的dp一样去转移由于权值存在负数,而负数下标是不能访问的,但是,从定义出发,我们从(1, 1)走到(i, j)的路径的总价值为-k的情况,是一定存在一原创 2022-04-11 19:46:05 · 413 阅读 · 0 评论 -
第十二届蓝桥杯省赛第一场C++「砝码称重」
砝码称重题目描述:你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,···,WN。请你计算一共可以称出多少种不同的正整数重量?注意砝码可以放在天平两边。思路:值域很小,才1e5,所以可以考虑01背包我们把重量为w的砝码放左边看作-w,放右边看作+w那状态转移方程就是:dp[i][j] = dp[i - 1][j] | dp[i - 1][j - w] | dp[i - 1][j + w]有一个问题是dp[i] [j - w]可能会访问到负下标我们从定义的角度上来分原创 2022-04-05 10:56:27 · 615 阅读 · 0 评论 -
有依赖的背包问题「树上分组背包」
有依赖的背包问题题目描述:n个物品,容量为m,物品之间有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大求最大价值思路:如果考虑每个子树中选哪些点,复杂度就是指数级别的,所以我们需要换一种分类方式,可以发现总体积很小,就100,可以考虑按背包的方式来定义,dp[u][v]表示以u为根的子树中,选u,且选择的体积不超过v的方案中的最大价值对于u的每个子树v,我们可以枚举该子树v用的体积来更新u的值原创 2022-03-30 16:30:49 · 703 阅读 · 0 评论 -
二维费用的背包问题
二维费用的背包问题题目描述:N件物品,容量是V的背包,背包能承受的最大重量是M每件物品只能拿一次,体积是v[i],重量是m[i],价值是w[i]问在容量和重量允许范围内,能获得的最大价值是多少思路:#include <bits/stdc++.h>using namespace std;#define endl '\n'#define inf 0x3f3f3f3f#define mod 1000000007#define m_p(a,b) make_pair(a,原创 2022-03-27 21:02:17 · 936 阅读 · 0 评论 -
最长公共上升子序列「LIS」「LCS」
最长公共上升子序列题目描述:给两个数组a和b问两个序列的最长的公共上升子序列的长度思路:状态:dp[i][j]表示a数组的前i个,b数组的前j个中以br[j]为结尾的公共上升子序列的最大长度转移方程可以将最长公共子序列和最长上升子序列结合起来思考先思考最长公共子序列,也就是分成a[i]是否在公共上升子序列里,如果不再,则dp[i][j]=dp[i-1][j],在的话,需要进行细分,按照最长上升子序列来进行细分,因为a[i]在当前公共上升子序列里,所以需要去找倒数第二个在当前公共上升子序列原创 2022-03-23 16:13:02 · 405 阅读 · 0 评论