
dp
文章平均质量分 59
stduy_ing
这个作者很懒,什么都没留下…
展开
-
蓝桥杯 第九届真题-堆的计数(dp)
链接:第九届真题-堆的计数题意:思路:首先,对于当前有n个节点的小根堆,如果我们任意选择l个节点放到左边,左边的l个节点,一定又可以构成小根堆,那么计算这l个结点的小根堆个数就变成了一个子问题。那么我们设dp[i]表示i个结点可构成的小根堆个数,那么可以得出转移方程为 dp[i]=dp[l]∗dp[i−1−l]∗c(i−1,l)dp[i] = dp[l] * dp[i - 1 - l] * c(i - 1 , l)dp[i]=dp[l]∗dp[i−1−l]∗c(i−1,l),l表示左子树的结点原创 2022-05-29 11:07:30 · 428 阅读 · 0 评论 -
Codeforces 1550-E. Stringforces(二分 + 状压dp)
链接:E. Stringforces题意:给一个长度为 n 的字符串,包含’ ? '和前 k(k <= 17) 个小写字母现要求把问号替换成字母,使得字符串的价值最大。对于一个字母的价值为 : 完全由该字母组成的最长子串的长度。该字符串的价值为所有字母价值的最小值。思路:1.首先答案肯定是有单调性的,如果能构造出长度 l 答案,那肯定也能构造出比 l 更小的答案,所以我们先二分答案。2.主要是怎么判断能不能构造出这个答案,假设我们现在二分的答案为 x .我们可以先预处理出从位置 i 往后得原创 2021-07-15 20:43:30 · 238 阅读 · 0 评论 -
Codeforces Round #721 (Div. 2) E. Partition Game(线段树优化dp / 决策单调性优化)
链接:E. Partition Game题意 :给出一个长度为 n 的数组 , 要求把它分成 k 段 , 每一段的权值为 当前这一段中每个不同的数 最后一次出现的位置与第一次出现的位置之差 的和。例如[2 3 2 2 3 1]的权值为 4 - 1 + 5 - 2 + 6 - 6 = 6.现在要求这个权值和的最小值。思路 :1.如果用 dp[i][j]表示把前 i 个数分成 j 段的最小权值 ,那么不难想到一个 n2n^2n2k 复杂度的dp方法 , fi,j=mink=1i{fk,j−1+wk原创 2021-05-24 09:06:57 · 204 阅读 · 0 评论 -
AtCoder Regular Contest 116 D - I Wanna Win The Game(二进制 + dp)
链接: D - I Wanna Win The Game题意:给定一个 n , m (1 ≤\leq≤n , m ≤\leq≤ 5000) , 求有多少个长度为 n的A序列满足,a[i] ≥\geq≥ 0 ,所有 a[i]的和为 m ,异或和为 0 .思路:最暴力的思路就是n三方dp,但肯定是不行的 , 所以我们可以考虑二进制,异或和为 0 其实就是n个数的每一个二进制位,每一个二进制位都有偶数个 1,这样就能保证异或和为 0 .所以我们可以用sum[i][j]表示到第 i 个二进制位的权值和为原创 2021-04-07 23:33:55 · 217 阅读 · 0 评论 -
Codeforces Gym 102956 C. Brave Seekers of Unicorns(位运算 + dp)
链接 :C. Brave Seekers of Unicorns题意:给你一个数 n (1 ≤\leq≤ n ≤\leq≤ 1e6),要求出有多少个严格单调递增的序列满足任意三个相邻的数满足 a[ i - 1] ⨁\bigoplus⨁ a[ i ]⨁\bigoplus⨁a[ i + 1] ≠\neq= 0 .思路:考虑dp , dp[ i ]表示有多少个以 i 为结尾的合法序列,那么不难得到转移方程 dp[ i ] = ∑j=1i−1\sum_{j=1}^{i - 1}∑j=1i−1 dp原创 2021-03-16 09:08:51 · 333 阅读 · 0 评论 -
2020 CCPC (威海) - L Clock Master(分组背包)
链接: L Clock Master题意:题目说了一大堆 , 其实简化一下就是 给你一个 n ,把 n 分解成几个数相加 ,使这几个数的 lcm 最大。思路:要使 lcm 最大 ,选的几个数肯定是互质的 ,不然就会产生无用的贡献,所以把每个质数和它的幂次分成一组(每组选一个),然后跑分组背包,求最大贡献就好了。质数 加上它的幂次好像就 3000 来个,最后差不多 1e7 , 一开始 T 了,然后把 log 预处理一下就过了。代码:#include<cstdio>#include&原创 2020-10-29 11:38:51 · 357 阅读 · 0 评论 -
HDU 6549 - String (dp 前缀优化)
链接: String 题意:有一个字符串 ,每次可以将一个长度不大于 l 的子串修改成同一种字母,问至少修改多少次可以使字符串最多含有 k 段。思路dp[ i ][ j ][ k ] 表示 将前 i 个分成 j 段 当前字符 为 k 的最小操作次数 。状态转移就是 如果当前这一位不修改 ,可以由 前一位分成 j 段 字符也为 k 转移 ,或者 由前一位分为 j - 1段 ,这一位不为 k 转移 ,这里就会有 25 种情况 ,如果再加一次循环肯定会 T , 所以可以在 dp 过程用前缀最小值记原创 2020-10-10 10:22:17 · 303 阅读 · 0 评论 -
牛客练习赛 71 C - 数学考试 ( dp 前缀优化 )
链接: C - 数学考试题意 :给出 m 个限制 , 每个限制为前 p 个数不能为 1 - p 的排列 , 求满足条件的1 - n 的排列个数。思路:1 . 考虑一下这个限制 , 前 p 个数不能为 1 - p 的排列 就等价于前 p 个数的最大值不能是 p , 所以可以考虑用 dp[ i ][ j ] 表示前 i 个数的最大值是 j ,限制就可以表示为 dp[ p ][ p ] = 0,接下来就转移就好了。2 . 因为这里的一个状态可以由多个状态转移过来 , 例如 dp[ i ][ j ]原创 2020-10-10 09:51:18 · 268 阅读 · 1 评论 -
牛客 7329 D - 火柴排队 (dp + 组合数)
链接: D - 火柴排队题意:给一个长度为 n 的数组 , 使其中 k 个元素的值增加 x , 分别求出 k 等于 1 - n 时这 n个数的相对大小不变的概率 。思路:其实就是求 有 k 个元素增加 x 的方案数 , 不难想到用 dp。dp[ i ][ j ][1] 表示前 i 个 有 j 个数增加了 x,并且第 i 个数增加了 x.dp[ i ][ j ][0] 表示前 i 个 有 j 个数增加了 x,并且第 i 个数没有增加.然后转移就好了 , 当前加x可以由上一个加或者不加转移 ,原创 2020-09-26 19:57:38 · 132 阅读 · 0 评论 -
Codeforces gym 102219 F. Military Class (状压 dp)
链接: F. Military Class 题意:给两个 1 - n的序列,要求序列中的数两两配对,使得配对的两个数绝对值之差小于 e ,并且还有 k 对限制,即 u 不能和 v 配对。思路:观察到 e 的值只有 4 ,也就是 当前数最多与 9 个数配对,所以可以状压表示配对到当前位置,已经用了 9 个位置中的哪几个,注意判断是否冲突时要把上一个状态右移一位,和当前位对应。代码:#include<iostream>#include<cstdio>#include<原创 2020-08-08 21:58:53 · 1103 阅读 · 0 评论 -
Codefoces Educational Codeforces Round 92 (Rated for Div. 2) B. Array Walk ( dp / 记忆化搜索 )
链接: B. Array Walk 题意:给一个数列 ,初始价值为 a[1],每次你可以选择向右走或者向左走,走完获得当前位置的数值,最多向左走 z 次,并且不能连续两次向左走,问走 k 步获得的最大价值。思路:dp [ i ][ j ] [ k ] 表示当前走第 i 步,已经向左走了 j 次,当前向左还是向右。然后直接转移就好了,如果当前向右,那上一步既可以向左也可以向右,如果当前向左,那上一步只能向右。还有当前位置为 i - 2 * j + 1.(1表示向左,0表示向右)dp[i][j][原创 2020-07-30 09:27:51 · 418 阅读 · 1 评论 -
2019牛客暑期多校训练营(第七场)H-Pair (数位 dp)
链接:H-Pair题意:求 A & B < C 或者 A ^ B > C 的 (A, B)的对数。思路:还是数位 dp ,把数拆成二进制一位一位考虑, 先那 & 来考虑 还是记录 当前的值是不是和 C 完全相同,如果相同就是 1 ,如果前面位已经出现过小于 C的了 就是 0,如果前面出现过 大于 C 的 了 就是 2 代表不合法。如果当前两个状态都不合法,则无法进入下一个 dfs。最后判断一下 两个状态是不是有一个是 0 就好了 是就返回 1 ,还有 A,B 都大于原创 2020-07-29 00:13:32 · 176 阅读 · 0 评论 -
2020牛客暑期多校训练营(第六场)H-Harmony Pairs (数位 dp)
链接: H-Harmony Pairs题意:求 0 <= A <= B 中 S(A) > S(B)的 A,B 的对数,S(A)是 A的各位之和。思路:首先 S(A)> S(B),很好解决,dfs维护一个 A B 的当前数位差就好了,还有就是 A <= B,再来一个状态表示 当前所有位 A和B的每一位是不是都相同就好了,若都相同 B的当前位必须大于等于 A的当前位,否则就随便取。所以 dp记录当前位置,数位差,A是否等于 B, 再记录一下两个 limit (一开始没记原创 2020-07-28 23:36:42 · 396 阅读 · 1 评论 -
HDU 6787 Chess (dp)
链接: 2020 年百度之星·程序设计大赛 - 初赛三 1005 题意:有一个长度为 n 的棋盘,你每次扔筛子可以向前移动 1-11格,你还可以在棋盘上设置 m 个传送器,传送到当前位置以前的位置,问有多少种传送器的摆放方式,使你可以到达 n 点。思路:‘分析一下什么情况下不能达到 n 点 ,因为传送器只能往前传,所以当这里有大于连续 10 个传送器时,他就无法到达 n 点。所以可以设置 dp 状态为 dp[ i ][ j ][ k ],表示到第 i 个位置摆放了 j 个传送器 ,并且有 k原创 2020-07-27 10:31:01 · 338 阅读 · 0 评论 -
HDU 6778 Car (状压 dp)
链接 : HDU 6778 Car 题意:有 10 种尾号的车 ,周一到周五每天限号若干尾号的车,要使5 天被限号车的最小值最大(也就是每天被限号的车都要大于 n-m)。思路:首先要搞清楚题目要求的是什么,要使每天不被限号的车都小于等于 m ,也就是每天被限号的车都要 大于等于 n-m ,那不就是要使 5 天中被限号的最小值都要大于等于 n-m.其实就是求最小值最大。然后问题就变成了 10 个数分成 5 组,使 5 组数和 的最小值 尽可能大。然后就可以状压解决了,枚举当前组数,当前 已加原创 2020-07-26 11:38:22 · 187 阅读 · 0 评论 -
Codeforces Round #658 (Div. 2) D. Unmerge ( 思维 + 01 背包 )
链接: D. Unmerge题意:定义两个数组的合并运算为 每次取出两个数组中第一个元素较大的那一个放入新数组,现给出一个长度为 2 * n 的置换数组,问 能不能找到两个长度为 n 的置换数组合并后为原数组 。思路:首先观察到 当前数组的一段 ,肯定是要小于 另外一个数组的第一个元素的 ,所以在当前最大值 到下一个最大值的这部分数肯定是属于同一个数组的。举个例子 3 1 2 5 4 6 7,是可以分成 【3 1 2】【5 4】【6】【7】四部分。然后 就变成 01 背包问题 了,选当前部分原创 2020-07-22 15:54:45 · 172 阅读 · 0 评论 -
UVA 1401 Remember the Word ( 字典树 + dp )
链接: Remember the Word题意:给一个 字符串 s 和 n个 字符串 问字符串 s 可以有多少种拆分方式 使得分成的每一个小段都可以从n个字符串中找到。思路:从后往前 dp ,dp [ i ] 代表从 位置 i 到字符串结尾的这一段的拆分方案 ,然后从后往前 ,对每个后缀进行查找 ,如果能找到长度为 x 的串 那么 dp[ i ] + = dp[ i + x ],依次更新,最后答案为 dp[ 0 ];写了 n 个 strlen 然后 T l了 20 发 ,www (再用 st原创 2020-07-20 21:55:59 · 269 阅读 · 0 评论 -
CSUST 2005 修仙 ( dp )
链接: 修仙 题意:你第 0 秒在 1 1位置,每个位置 经过 mp [ i ] [ j ] 秒后产生一个蘑菇,每个蘑菇存在一分钟,每次可以向四个方向移动一个,但不能回到上上次的方格,问 第 k 秒 刚好在 n , m 点 最多可以吃多少个蘑菇。思路:状态还是很好想的 dp 记录 第 x 秒 在位置 i , j ,然后由四个方向转移,但这里有一个限制条件,不能和上上次的点相同 ,所以可以在加两个状态 上上次的坐标 。 1e7 的空间。时间大概 只有 1e6 因为只能由四个方向转移得到。代码:原创 2020-07-19 09:37:52 · 172 阅读 · 3 评论 -
CSUST 2007 我爱吃烧烤 (状压dp)
链接: 我爱吃烧烤题意:总共 n 家烧烤店,有 m 家特殊烧烤店,从 i 到 j 号烧烤点有 mp [ i ] [ j ] 种方案,消耗一点体力值,问消耗 q 点体力值且至少经过 k 家特殊烧烤店的方案数。思路:dp 记录 当前花费体力值,当前所在烧烤店编号,还有当前走过的特殊烧烤店,当前走过的烧烤店状压一下就好了,最多才 10 家。所以空间复杂度 50 *50 *1024 ,还是可以接受的,然后在转移的时候 ,还要枚举当前烧烤店是由 上一次的哪一家烧烤店转移过来的 ,所以 时间复杂度 50原创 2020-07-19 09:20:28 · 160 阅读 · 1 评论