01 2024 档案
摘要:这一道题目看到 很小,考虑状压 这个状压的状态只考虑了前 的位置,后面的人都忽略了。由数学归纳法可以知道,这其实是正确的 我还要证明一下这种转移的正确性:即证明对一个区间 ,当乐队顺序固定后,出列的人数最少就是 一开始就在对应乐队的区间中的人数 其实用
阅读全文
摘要:这道题目看到 非常小,可以尝试往状压上想 本来我是想像“校长的烦恼”那道题目一样,将物品作为阶段的,但是显然这里的 太大了,时间复杂度没有办法承受 所以只能将状态作为阶段,那么考虑数组值应该表示什么 我们读题发现,他让我们求的是最后剩下多少钱,我们此时已经把硬币状态记在某一维度里面了
阅读全文
摘要:主要是拿这道题目练练手,用蓝书的三进制状态压缩思想和老板的二进制状态压缩思想做做 但是千万别被三进制状态压缩给弄混了,比如这道题目,非常简单,只用知道最后一行的状态用二进制状态压缩就行了,这就可以类比炮兵阵地,因为炮兵阵地这道题目是炮兵可以影响后面两排,而这里只能影响后面一排,所以前者用三进制状态,
阅读全文
摘要:具体解法见蓝书 可以想一下如何像老板那样做,即状态只考虑前 行放置的炮兵(因为这样他们的攻击范围才是全在前 行里面)怎么做 如果用二进制状态压缩,应该是需要用两位描述第 行和第 行的状态的(本质上就是蓝书上的解法一)
阅读全文
摘要:有趣的是,这道题目如果像老板一样考虑是很好做的,但是如果像蓝书一样考虑似乎做不出来,否则就要用五进制状态压缩了
阅读全文
摘要:这道题目稍加思索就可以知道是状态压缩题单的第六题 当然第六题的方法太高级了,这是在每一维都开最大的情况下空间无法承受的情况才使用 这道题目完全可以用更简单的实现方法(当然也没必要开很多维,用一个高进制数实现就好了) 这个高进制数的比较的代码要记住
阅读全文
摘要:蓝书上面的最后一行考虑的状态是考虑的放到下一行的竖着的长方形的个数 而老板的PPT上考虑的状态是更常规的思路,只考虑整块长方形都在前 行的方案数 在转移的时候先用dfs把第 行的 全部铺满(无论是用横放还是竖放),然后再得出第 行的状态 update 2024.7
阅读全文
摘要:但是我怎么判断一个人是否被选了多次呢? 如果能问出这个问题,就说明我们陷入了思维定式 我们以前的状态压缩都是以二进制状态为阶段进行DP,这里我们如果再这么做,就必须记录某一位求职者是否被选择了,那么时空复杂度根本无法承受 所以我们换个思路,直接以求职者为阶段,当一个背包做 讲一下为什么这种代码一个人
阅读全文
摘要:这道题目非常简单,我只是想说一个东西 题目说“开始时球在任意一个人的手上”,我们不要去搞个 次DP,而是像下面这样 脑子别犯浑了。。
阅读全文
摘要:update 2024.9.1 证明不了正确性,而且上面的第一种转移是忽略了阶段的,如果要进行第一种转移,只有先对所有状态做第二种转移,然后选出最小的状态去转移其他状态;把这题背下来吧
阅读全文
摘要:这个令 为最小的节点为啥是对的啊?感觉有点问题的。但是如果用填表法倒是可以枚举在集合中的编号最小的点的,因为这个点一定要与某个点配对 带花树是啥啊? update 2024.9.1 这种选编号最小的优化一个次方的技巧一定要记住,属于状态转移的等效缩放
阅读全文
摘要:蓝书上的那个补全数组思想其实是 当然这个问题完全可以拓展到状态压缩 中间那一串是乘法的意思 状态压缩具体内容见状态压缩的专题
阅读全文
摘要:可以尝试推导一下,是推不动的,但是又没有什么更好的状态设计的方法,这个时候可以尝试分摊费用 我们先随便写一个序列,考虑费用是怎么产生的,然后怎么分摊费用给每个单元 如图,箭头的长度之和就是总费用 所以一个很显然的分摊费用的方法就是:对每一个箭头,把他跨过的位置对答案的贡献加一(也就是每个位置产生的费
阅读全文
摘要:其实做到这里,可以想一下费用提前计算的题目有什么特征 首先,如果按照正常的DP,一个单元所产生的的费用是要等DP到这个单元的时候才计算的 而如果这个单元的费用可以拆分(比如此题,时间乘以费用系数,由于系数固定,所以把时间拆分出来,也就是乘法分配律,\((a+b+c...)\times d=ad+bd
阅读全文
摘要:这道题目是很典型的费用提前计算的题目 费用提前计算,我们考虑如何分摊费用到每个单元上 这里就是在走向一个路灯时,把这段时间剩下没关的所有路灯的费用算到这个路灯上 然后尝试推一下方程,由数学归纳法可知是能够推走的
阅读全文
摘要:费用提前计算,一个很重要的思想就是考虑如何分摊费用到每个单元上,然后直接计算每个单元对全局费用的贡献 这道题目可以知道,比较特殊的是蓝草和绿草(所以下面就先考虑这两种草而忽略红草) 对于蓝草,我们种在某一格,他对全局造成的影响是什么?他既会使前面(定义为从入口那端开始数)的绿草的中毒的伤害增加也会使
阅读全文
摘要:很容易想出一个状态,设 表示以 为根节点,安装 个监听器,根节点是否安装了监听器的总方案数 然后你去推,就会发现我们还需要知道根节点是否被监听这一个信息(最开始 那一维设成根节点是否被监听也是会发现需要知道根节点是否安装了监听器) 所以我们设
阅读全文
摘要:看到这种题可能一来没有思路,但是很明显地可以发现DP方程为 表示以 为根的子树, 的值为 的最小权值 显然会超时,但是我们也显然没有什么更好的DP状态可以设置,所以DP状态肯定是这个 那么就是说我们的第二维设置大了,这就说明有引理会让整棵树的最大权值不是很
阅读全文
摘要:看这篇题解 这道题目的启示:如果整体不好考虑,就考虑单个单元对答案的贡献 而且考虑贡献的时候,一定要注意,每个单元的贡献一定要考虑全局,即不要只考虑子树,也要考虑子树外的一部分 另外也可以把子树根节点与其父亲节点的连线考虑在DP状态内,也是可以推走的 update 2024.6.30 这道题目其实是
阅读全文
摘要:这是一道自顶向下的树形DP,可以见识一下 看这篇题解 这篇题解的状态的描述与转移都有些错的,可以看代码和评论区 主要就是知道,这种括号序列已经出现过很多次了,要知道一个合法的括号序列的拆分方式是唯一的,只可能是(A)(A是一个合法括号序列)或者ABC...(A,B,C...是合法的括号序列,而且他们
阅读全文
摘要:我们先按树形DP做 我们模拟一下如何走,会发现有可能会先从根节点往下走,然后回到根节点,再从根节点继续往下走,这个过程甚至可以重复多次 所以我们会发现很重要的一点就是是否回到根节点,所以我们设 表示根节点是 ,走 步,终点是不是根节点的最多走的点数(注意
阅读全文
摘要:这里主要就是复习一下,充分利用DP状态,设某一维度为人数,而值表示最大利润 还要注意,时间复杂度是
阅读全文
摘要:这道题目主要是记住他这个状态的设定,是“不少于”而不是“刚好” 然后看看那个状态转移方程,是不会遗漏最优解的(就是是正确的).比如这篇题解,假设方程中 和 是正确的,那么对于 的最优解,我们在遍历完所有 之后,一定可以把最优解给
阅读全文
摘要:这道题看不懂题解在说啥。。 update 2024.8.31 其实这道题目应该等价于Caterpillar on a Tree,Ans && Conclusion
阅读全文
摘要:我们来明晰一下状态。注意每个状态说的是与根连通的同色块。也就是说这个子树里面连通同色块可能有很多个,但是与根连通的同色块只有一个 也不难证明,在最优方案中,连通同色块涂全价的点只有一个 我们在考虑推导 时,当然是考虑 的子节点是否与其同色,所以有了上面的转移方程 求\(f
阅读全文
摘要:其实他这个DP状态解释的有一点问题,终点不一定非要是 其实就是在 的子树中找一条链,满足 是一个端点,然后另一个端点是否有陷阱(行进方向到时候再具体讨论,除了一些特殊状态, 为起点或终点都是可以的);然后一定要注意,这个状态是从起点到终点经过 个陷阱的最优值
阅读全文
摘要:很容易想到一个状态,设 表示以 为根的子树, 是否放警卫 但是这么做,在推导的过程中就发现,若 放了警卫,那么他的儿子是可以不用放警卫的,而且孙子也可能不用,然而儿子的 却按照孙子一定放警卫来做的,所以可能错,于是必须加维 update 202
阅读全文
摘要:尝试证明一下,剪枝一定是从叶子往上面减(即剪了多少枝就少了多少点),于是有
阅读全文
摘要:这个DP方法一定不会遗漏最优解 我们假设最优解中,第 个邮局管辖的村庄集合是 ,那么以 中横坐标最小的村庄为分界点,这个分界点一定会被枚举到的,而且由于这个方案是最优解,如果我们把第 个邮局放在中位数那里,其他村庄的管辖是不会变的(否则就不是最优解了) update
阅读全文
摘要:受到国王游戏的启发,我们可以考虑当一个队伍的人定了之后,如何排序会最优 利用国王游戏的方法会发现是按照 数组递减排序 如果不交换,是 ,交换之后是\(max(a_{i+1}+b_{i+1},a_i+a_{i+1}+b_i)
阅读全文
摘要:考虑这个区间的最终组成,要么是两端匹配,要么是两个括号匹配串挨在一起 update 2024.6.29 千万不要漏了两个合法的串拼起来也是合法的串的转移 update 2025.1.8 为什么两端匹配的情况图片中只考虑了给最右边的括号添加一个匹配的括号呢?为什么不考虑给最左边的括号添加一个匹配的括号
阅读全文
摘要:这一道题目有一个很容易想到的状态 但是这里的状态描述有一点点问题,不应该说“不超过”,而应该说“刚好为” 然而内存肯定不够,此时我们的思路肯定就是利用数组的值去存储总重量,也就是 update 2024.6.26 想到了一种新状态,应该是正确的(还没有写过对拍验证) 这种状态不用倒序 设\(f[i]
阅读全文
摘要:其实这道题目严格证明不丢失答案还是有点难度的 按照常规做法,我们设 表示区间 的最佳答案 但是我们发现这道题目不能像石子合并这样转移,因为他必须要求值一样的才能合并 所以我们可以仿照消木块这道题目,想一想两个端点如何消去 如果左端点不参与形成最终答案,则\(f[l
阅读全文
摘要:这道题目肯定是费用提前计算 当然我们可以换一种理解方法来更严谨地理解费用提前计算 我们一开始就把所有的 求和,然后认为我们在行动过程中,有些彩蛋的价值会减损,显然我们就是要让这个减损值最小 然后我们发现由于我们不会走回头路(也就是在第一次经过某个彩蛋的时候一定会立马收集而不是等着),所以我们
阅读全文
摘要:这一道题目可以感觉到,如果没有覆盖全部区间的一次涂色,那么一定会有一个分界点 考虑覆盖编号为 的方块的最后一次极长操作,假设为 (“极长”指不会缩短,也就是说最终的方案中,位置 不会被其他操作覆盖,也就是说位置 的最后一次操作也是覆盖位置 的最后一次操
阅读全文
摘要:假设我们按照常规的方程设置的方法,设 表示消除区间 所有木块的最大得分,我们考虑最后一段颜色相同的木块 这一段木块要么自己被单独消掉,要么与前面颜色相同的木块一起消掉 对于第一种情况,这个操作肯定可以在最开始做而不影响答案,所以有\(f[i][j]=f[i][k]
阅读全文
摘要:蓝书上把这道题目叫做“二维平面上的区间DP” 那么什么叫做“二维平面上的区间DP”呢? 想一下,区间是一个线段,所以是一个一维的,二维当然指的就是平面,所以“二维平面上的区间DP”就是平面DP 回到这道题目,像一维一样,我们以平面的大小为阶段进行DP即可 当然这道题目其实用记忆化搜索更加自然
阅读全文
摘要:主要解释一点,为什么除了枚举分段点之外,只用考虑当前这一段长成 这个样子(其中 是一个折叠串) 其实很简单,如果他不长成这个样子,那么他一定会有一个分段点,使得他长成 这个样子,这也就是之前枚举分段点的情况了 我们考虑第二种情况时,注意 是一个折叠串,所以一定
阅读全文
摘要:这道题目是一道典型的完全背包 主要是记一下这个优化的思想 试想,如果我们没有学过背包,那么我们很可能枚举最大的一个数字是多少,有多少个,这样复杂度就会多一个次方 在这个时候,我们就要看出来是完全背包,从而不用枚举“有多少个”这一循环,只用枚举最大的一个数字是多少,从而降低时间复杂度
阅读全文
摘要:把题解翻完,会发现有两种状态方程,都行,反正表达的值要么是高度要么是生命值麻,我们看一个DP题,最终表达的值一般都是题目中的一个信息(不一定是要求的答案)
阅读全文
摘要:其实这道题目如果加上证明有蓝的 观察样例的解释,我们可以猜测一个结论:最终的货币面值一定由最初的货币面值的子集构成,而且没有选择的货币面值是可以被选择的货币面值线性表示的(其实由线性代数的思想也可以比较容易地猜出这个结论,但是注意不要用线性方程组有解判定,即系数矩阵的秩等于增广矩阵的秩,因为这里要求
阅读全文
摘要:这道题目观察样例的输出就可以知道需要用trie树 然后用样例模拟一遍就可以发现,添加相当于在trie树上向下走一步,删除相当于在trie树上向上走一步 分析题目可知每条边最少被走两遍,除了最后的那一个单词所包含的边 所以我们找出最长的单词就可以了,最后走那一个单词,在trie树上dfs
阅读全文
摘要:这道题目可以使用转换对象法:比如说添加操作,我们不妨将已知字符串删去一个字符(每个已知字符串可以产生 个新字符串),然后再建立trie树,然后让查询字符串在trie树上面找就可以了 也可以直接枚举每个查询字符串编辑距离为 的字符串,然后在trie树上查找 也要学会一种新算法:tri
阅读全文
摘要:这道题目主要是细节问题 注意矛盾是形成了环 注意有前缀也不可能排第一
阅读全文
摘要:这道题目主要就是提醒一下看清楚空间要求 但是有一说一,对询问建trie不如直接STL
阅读全文
摘要:看这篇题解 解释一下 首先是状态的定义,具体来说, 应该表示考虑了准考证前 位,准考证的后 位与不吉利数字最多匹配的位数为 ,且整个准考证号不包含不吉利数字的方案数 这个最多匹配的意思:比如不吉利数字是 ,准考证号是 ,那么
阅读全文
摘要:这一道题就是求若干个候选项 一个很容易想到的办法就是倍增,但是需要卡常 可以看看洛谷的代代码(不是题解),这种方法可以 实现转移,很巧合的一个东西 那个 就是形成的KMP树的节点的深度(相当于还能跳多少次next),原理就是利用上一个位置跳到的地方已经是小于等于\(\frac{
阅读全文
摘要:利用KMP和双端队列 这一道题目中间会删除字符,考虑到这种动态的过程我们一般会用链表,栈或者队列维护 这里为了方便最后的输出用双端队列 考虑KMP的过程,他其实对字符串是不是在连续的一个存储空间里并没有要求,也就是说,如果我们给了一堆字符,即使不是按照字符数组那种放在连续的存储空间里面,只要我们知道
阅读全文
摘要:对任意一个符合条件的周期 ,设长度为 ,设字符串的长度为 ,则一定有 是 的候选项 这个画个图就明白了 由于题目要让 最大,所以我们用类似递归的方法即可,具体见代码,注意好好看看,特别是边界问题 提醒一下,蓝书P75说一个字符串的任意循环元的
阅读全文
摘要:见这篇题解 主要掌握: 1.如何用字符串hash统计字符的个数,想明白如何 修改和查询以及正确性 2.双端队列模拟的思路记住 3.注意学习 数组的思想(其实看到循环就可以考虑直接统计贡献)
阅读全文
摘要:这一道题目作为最玄学的无法严格证明的题目记住,加深一下印象 主要是阐述第一个题解说明的问题 我们的AC代码也有这个问题,对于第一篇题解给出的那个反例,我们也会输出INF的 但是看看第一篇题解下面说的,我们不用考虑来回修改的问题 为什么?这里解释一下 为 但是要将 修
阅读全文
摘要:这道题目很容易想出一个状态: 表示前 个木板一共涂了 次的最大价值 然而我们在枚举的时候可能就会同时枚举当前这个木块涂得次数以及涂的最后一个位置是哪里 这样的时间复杂度就是 会超时 但是很显然状态应该与这个大差不差,根据我们前面几道题目,我们
阅读全文
摘要:首先来看一下蓝书上面的两个思考题 一. 将一个序列 改成单调不下降序列,最少需要修改多少个数? 答:用 的长度减去其最长单调不下降子序列的长度即可 那如果在最少修改数的基础上,我要让每个数改变的绝对值之和的最小值最小怎么办? 答:首先,这根“Making the Grade”这道题目
阅读全文
摘要:很容易想到一个状态 表示 串前 个, 串前 个,从 中取了 个子串的总方案数 但是稍微推一下状态转移方程就可以知道这个时间复杂度和空间复杂度都会爆炸,其中时间复杂度为 空间复杂度可以用滚动数组来优化,所
阅读全文
摘要:裸的LCS问题。求长度并不困难,困难的是如何输出所有方案 所以这道题目可以作为DP输出方案的一道典型题目记住 我们一般的方法是记住当前状态是由哪个状态转移过去的,然后逐步递归输出 下面的代码的 表示两个串分别的前 个,前 个,LCS还剩下 个字符的所有方案(这里
阅读全文
摘要:这种微调状态的trick可以学学。以后计数DP觉得时间复杂度稍微超出了,而且状态显然要这么设置并且没有什么优化空间的时候就可以这么想(这种处理方式跟前面的线性DP最后一个选还是不选的处理方式是差不多的) 这里是计数DP的要求,做到不重不漏(这里的处理方法跟“金字塔”这道题目是一样的) 这里要注意,对
阅读全文
摘要:最开始很容易想到设 表示区间 合并出 是否可以,显然复杂度爆炸 这样做的问题是什么? 冗余状态太多了!题目只关心给的那一个 ,我们只用想如何达到这个 即可 既然这样,我们考虑最终这个数是怎么来的,手动模拟一下 设有五个数A B C D
阅读全文
摘要:再提供一种证明方法,画的图跟Y总一样 那个红框框里面,我们任选一个点,比如中间那个点,设为 ,我们将其向靠近 移动(不妨设为向上),在移动过程中,有可能会导致后面一些比 大的 跟着往上面移动,然后改变和值,当整体往上移动会导致和值变大时,我们将整体往
阅读全文
摘要:这道题目本来很简单 主要是来看一下普通DP怎么做 这个相当于形成了一个DAG 这种矩阵成DAG的模型可以注意一下
阅读全文
摘要:
阅读全文
摘要:这道题目可以二分 求出二维前缀和,枚举每一个顶点,然后二分正方形边长,显然具有单调性,时间复杂度为 如果 为 怎么办? 这个时候要用到DP 说明一下正确性 假设我们的 取的是 ,如下 那么对当前这个顶点的正方形就是
阅读全文
摘要:回文串一般可以考虑把串倒过来思考问题 对一个给定的串,我们将其倒序,设其长度为 ,求出原串和倒序的串的LCS,设长度为 ,则答案为 证明: 我们假设已经获得了最终的回文串,然后我们将这个回文串倒序,那么肯定这个回文串与这个原串是相等的 以样例为例 其中红色字符是添加的字
阅读全文
摘要:第一问不说了,主要是第二问 第二问考虑贪心,利用数学归纳法证明 这里还有一种贪心策略,就是从右边往左边考虑,但这样好像证不出来 因为这是NOIP的题嘛,没有那么难,看到序列最优化的问题往贪心或者DP上面想喽 当然介绍一个定理
阅读全文
摘要:我们先证明这个子矩阵一定可以放在左上角 假设我们在原矩阵中随便取一个矩阵(这个矩阵不与四条邻边挨着),然后让这个矩阵无限的复制延伸可以覆盖原来的矩阵,那么重新选取一个矩阵,这个矩阵是我们最开始选取的矩阵的每一列往左边走一位而行不变的矩阵,比如下面 其中黑色矩阵是我们最开始选取的矩阵,橙色矩阵是我们现
阅读全文
摘要:这道题目就是一个二维hash模板 讲一下二维哈希 二维的数据结构一般都是先对一个既定的行做列(一维)上的操作,然后再把若干列当成一维处理行(数组指针指向一个二维数组就可以这么理解) 设 表示前 行前 列的矩阵的hash值 我们先对列做hash(设进制数为\(
阅读全文
摘要:蓝书上的hash函数一般都是在循环同构串的时候用,因为这个时候可以完美避免起点以及方向的问题 当然其实涉及了循环同构串了建议还是直接上最小表示法吧
阅读全文
摘要:在扫描过程中一旦扫描到一个子串01数量相等了,这个时候肯定是已经递归回到根节点了,因为从根节点下去的一步操作给了一个0,而这个0一定要从这条边回到根节点才能产生一个1与其匹配(这个1不可能来自其他边的回溯,因为其他边的回溯的前提就是之前从这条边下去了,就会产生一个0,,这个0就要与这个边回溯产生的1
阅读全文
摘要:洛谷的remotejudge好想崩了,代码交到cf上的 可以知道一次交换只会影响 内的数,分块暴力统计 直接考虑 和 不在同一个块里面的情况 我们需要预处理出一个数组 ,表示第 个块内比 小的数的个数,这里要用树状数组进行处理
阅读全文
摘要:在数组指针中,*和[]的意义是相似的,都是优先降维数在降指针的级数 比如p是一个指向n维数组的一级指针,那么p[][][]就是一个指向n-3维数组的指针,打了n个中括号之后就变成了指向一个点的指针,此时再*一下就变成了了值(或者再括号一下) 如果p是一个指向n维数组的三级指针,那么打了n个中括号之后
阅读全文