dp 题记录
CF1716D Chip Move
给定两个数 ,问从 开始,第 步只能走 的倍数,问分别走到 的方案数,对 取模。
考虑 ,设 表示当前在 ,走了 步的方案数。
初值为 ,暴力转移复杂度为 。
其中 为 的倍数,额,肯定是外层循环枚举走到了第 步,然后那么 是已知的。
考虑一个数在这种情况下会加上哪些数,维护一个前缀和应该就好了?
你这个看上去,就不能走太多步的样子啊其实。
因为 这个 始终小于等于 ,那么就可以根据这个做了。
首先滚动数组,之后我们每次维护一个魔改的前缀和就好了。
CF1701E Text Editor
给定两个字符串 ,初始时光标在串 尾部,你可以进行以下操作:
-
:将光标向左移动一个字符,如光标在字符串最左侧则不移动。
-
:将光标向右移动一个字符,如光标在字符串最右侧则不移动。
-
:将光标移动到字符串最左侧,如光标在字符串最左侧则不移动。
-
:将光标移动到字符串最右侧,如光标在字符串最右侧则不移动。
-
:将光标左侧的第一个字符从字符创中删除,如光标在字符串最左侧则不删除任何字符。
我们需要使 在做若干次操作后得到 ,请你求出最小的操作次数。无解输出 。
我草,不会啊,爬去看题解。
直观感受的话你肯定是用 left
和 backspace
或者在中间某个时刻突然 home
然后 right
和 backspace
。
那么,我们从前面和后面分别跑一遍 dp,然后枚举一个中间端点取答案的 就好了。
跑的 dp 形如 表示当前光标到了 的第 位,目前和 的 位匹配。
然后 是表示删除
然后 就可以不用删除,。
然后记录 表示 和 匹配的最小值。
的时候且不用删除小于删除,那么 ,就考虑不移动,否则 。
倒着过来的时候删除是 的。
然后最后前面和后面做一个匹配,一下就好了。
[HNOI2014]米特运输
一棵树,每个点有权值,要求修改点权值满足,每个点是儿子权值的和,同一个点的儿子权值相同。
要求最少的修改次数。
首先容易想到 ,然后发现确定了一个点的值就确定了所有点的值。
设当前节点的值为 ,那么此时根节点权值为 ,其中前面的连乘符号表示的是祖先的 连乘。
那么我们记录下这个状态,然后取最多的为同一个数的就好了,因为这样修改的就最少。
这个部分的话,可以哈希,也可以取对数来求。
取对数的时候注意不能用桶判断相同,要手写 eps。
牛客小白月赛 53 F
个长度为 的二进制数,要求选出里面的一个子序列,满足每一位没有重复的 出现,求有多少种子序列的方案数
我们很容易想到一个复杂度为 的一个 dp,是 表示考虑了前 个,以 结尾的满足要求的子序列方案数。
那么每次转移的时候也就是 ,这里做的复杂度就是 ,然后同时每次还要继承一下上一次的状态,滚动数组一下就好了。
但是不能过,这里有一种降低复杂度的神奇方法。
我们默认这里的 为最大的 ,令 表示考虑了前 个数,结尾的数的高 位为 ,低 位和 按位与后为 的子序列的方案数。
对于一个数可以 可以得到高位和低位。
那么我们首先模拟一遍 为高八位,然后如果 那么让 ,因为此时 表示 多对应 的那个低位也和 按位与为 ,那么就有贡献。
设这部分的总贡献为 ,
然后模拟一遍 为低八位,然后如果 ,那么我们现在对应的状态其实就是 ,那么我们此时对应的操作就是 。
第三维度从来指的都不是低 位,而是低八位 上他为 。
然后显然第一维其实是没有什么用的,于是我们就可以把他滚动掉。
这道题挺厉害的感觉。
Luogu P1272 重建道路
一颗 个点的树,然后要求删边,问,删边使得剩出一个大小为 的连通块要用的最小删边数量。
设 表示当前在子树 ,保留下一个含有他的大小为 的连通块最少要用的一个删边数。
初始化 ,啥也不管,然后考虑往下接儿子。
你发现这,其实就是一个树形背包,就直接每次从儿子转移过来的时候,考虑 就好了,然后这里一个要注意的点是,里面那个 一定要在每次循环枚举 之前就加了!
虽然我也不知道为什么会错,但是好像挺奇怪的,我思考了一下也不知道为什么。
复杂度树形背包写的正确的话就是 的,我也不知道为啥 。
CF873D Round Subset
不写题意了以后/难过。
注意到末尾 的个数之和 的个数有关,于是考虑状态 表示前 个选了 个,有 个 , 个 的时候是否合法。
空间不太行,所以压一下 表示前 个选了 个有 个 时最大的 的个数,同时第一维可以滚动掉,直接转移即可。
CF1710C-XOR Triangle
这题不会啊,感觉数位 dp 还是要重学一下。
容斥考虑不合法的三元组,然后用全部的三元组数目 减去不合法的数目就可以得到合法数目。
设 ,则有 。
是违法的判定条件
等价于 的二进制对中没有 , 中没有 ( 除外)
等价于 的二进制对中没有 , 中没有 ( 除外)
等价于 的二进制对中没有 , 中没有 ( 除外)
可以设 表示还有 位没考虑, 是否等于 , 是否全 (或 ),这个状态下的不合法数目。
用三个位表示前三个状态, 用三个位表示后三个状态、
初始 ,因为此时只有一种情况 。
枚举 当前位的选取情况,假设是 ,则 对 的贡献如下:
如果 当前位为 ,只能转移到 ,此时要保证 , 不然说明有等于 前缀且当前选择 的情况,这样就大于 了。
如果 的当前位为 ,则能转移到 ,计算出 要通过前面的状态 和 计算。
P3713 [BJOI2017]机动训练
转换一下题意,题目中的机动路径假如有 个,那么贡献 ,用组合意义转化一下,这个等价于两个人走同样的机动路径的方案数。
注意到,每个点移动的方向只会有一种,要么是左上,左下,右上,右下(类型一),要么是正上,正下,正左,正右(类型二)。
题目要求路径不能远离目标点,那么移动的方向一定是确定的,可以枚举方向。
所以可以设 表示第一个人从 出发和第二个人从 出发,走的机动路径相同,沿着当前的方向走的合法方案数。
然后每次枚举方向,然后搜出能走的选择,在直接记忆化搜索路径,然后就可以求得答案,注意到,我们的正上,正下之类的,会被类型一给包含。
例如:正上的抉择被左上和右上能走的方向中包含,算了两次,于是容斥一下,对于类型一的答案全部加上,对于类型二的答案全部减去就好了。
P5307 [COCI2018-2019#6] Mobitel
卡老师题
首先傻逼 dp,直接设 表示走到 乘积为 的方案数,但是空间太大了,完全寄。
考虑将状态进行另一种转化,我们并不关心具体的值,而是关心一个相对的大小关系,也就是 多少会比 大,设 表示走到 时,当前乘积 之后比 大的方案数。
本质不同的 的数量等价于是一个整除分块,于是只会有根号种,第一位滚动一下数组,可以开下空间。
然后刷表更新即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!