随笔分类 - 算法-动态规划
摘要:把所有位置按下标的奇偶性分类。考虑每个前缀里,两类位置上数的和之差。把对 h 的操作,变为对这个差序列的操作。操作变成了每次选一个小于 n 的位置,将它的值减 1。只要想清楚最终差序列的样子,就很容易求出合法差序列的数量了。
阅读全文
摘要:首先,全局最大值一定是其中一个子序列的最大值,所以只需要考虑另一个子序列的最大值是几。根据这两个“最大值”,整个序列被划分为三段,前一段两个序列都递增,中间一增一减,第三段都递减。第一段和第三段可以用简单 DP 完成最优划分。中间段其实也可以用一个类似的 DP 来划分。DP 定义的关键是考虑与 i 不同的另一个子序列最后一个元素是几,转移时考虑 i 和 i - 1 在不在同一个序列中。
阅读全文
摘要:分析题目性质,找出一些最基本的贪心策略(比如把 B 从小到大排序)。然后枚举总共获得了几个协作者,这样就能知道每个仅获得选票的州的用时,进而可以 DP。朴素的 DP 是 O(N^3) 的,总时间复杂度 O(N^4)。进一步观察问题特性后,可以把 DP 优化到 O(n^2)。
阅读全文
摘要:用总数减去不合法的排列数。考虑不合法的排列里的极长不合法段,那么不合法的排列可以分为两类:有两个极长不合法段的,或者有三个及以上极长不合法段的。对于前者,发现至少有一个不合法段是前缀或后缀,且数值为 1...k,可以递推求出其方案数(二次容斥)。对于后者,不合法段一定不相交。考虑用 DP 对齐进行划分,再用前面处理好的答案算出其排列方案数。
阅读全文
摘要:首先把问题转化为:有一个给定的数组 b[1...n],一个数 x,使得所有 (b[i] + x) 的二进制里 1 的个数之和最小。从低到高逐位 DP,发现要考虑上一位有没有进位,那么状态数是 2^n 的。进一步观察,因为每个数加的 x 是一样的,所以在这些低位上原数值越大,越有可能进位。所以状态里只需要记录有多少个数进位,然后把序列排个序,就知道具体是哪些数进位了
阅读全文
摘要:考虑最大前缀和所在的位置,需要满足什么条件。根据这个条件,可以得到一个状压 DP 的做法
阅读全文
摘要:枚举 r。注意到关键性质:位置 r 必被选出。顺着这个思路,看哪些点是能被 r 看见的。进一步发现大区间可以直接从小区间转移过来。于是可以自然地得到一个 DP 做法
阅读全文
摘要:首先转化为算每种完美匹配出现的概率之和。发现难点是处理 t = 1 和 t = 2。将一组的两条边拆开,假装他们就是 t = 0 的两组。考虑这样算会对答案有什么影响。t = 1 时,会在两条边同时出现在完美匹配里时,把概率少算 1/4。我们新建一种转移,把这 1/4 补回来即可。t = 2 同理。
阅读全文
摘要:考虑只划分一轮的情况。对于所有 k,发现划分为 k 块的方案数,要么是 0,要么是 1。对“有唯一一种划分方案”所需的条件稍作转化,就能求出每个 k 是否存在方案了。然后考虑不止划分一轮的情况,可以做一个简单的 DP。时间复杂度是调和级数。
阅读全文
该文被密码保护。
摘要:先考虑期望的定义,发现不好计算。于是补集转化,发现转化后可以通过简单的树形 DP 解决。添加叶子时,只需要更新它祖先的 DP 值。并且在精度允许的范围内,我们只需要更新距离不超过某个阈值的祖先。
阅读全文
摘要:很神的 DP 题!!!在 N 个关键点之间,做一个大 DP。大 DP 的转移系数是用另一个朴素的小 DP 预处理出来的。而这个朴素的小 DP 可以用矩阵快速幂优化!
阅读全文
摘要:涉及到无穷大的概念,就可以抛弃一些传统的 DP 做法。使用数学的推导。本题的状态设计和转移方式,都是非常巧妙的。
阅读全文
摘要:区间 DP。朴素想法是用第三维,记录区间内的赢家是谁。这样做复杂度是 O(n^5) 的。大胆地考虑,如果只记录左/右端点是赢家的情况,是否可以转移呢?答案是肯定的!
阅读全文
摘要:树形 DP。把第二维搬到线段树上,然后线段树合并。这是常见的套路(NOI2020 d1t2),但在本题里会 MLE。进一步优化,需要根据题目性质(有效 DP 值的单调性),将线段树改为 set,做启发式合并。
阅读全文
摘要:根号分治。对序列里小于 sqrt(n) 的数和大于等于 sqrt(n) 的数,用两种不同的 DP,分别计算出方案数,最后卷起来,得到答案。
阅读全文
摘要:分情况讨论。枚举最终相遇的环,然后对其他环做个背包。用 CSP2019 d2t1 的套路设计 DP 状态,只记录二者的差值。
阅读全文
摘要:区间 DP。朴素做法是 O(n^5) 的。通过更巧妙的状态设计,可以做到 O(n^4)。本文将详细讲解这种巧妙的状态设计,并帮助读者感谢理解它的含义。
阅读全文
摘要:最少的操作次数显然是 n - 置换环的数量。操作对每个置换环是独立的,将它们的操作序列用组合数插到一起即可。考虑求一个环的方案数。设 dp[i] 表示长度为 i 的环的方案数。朴素 DP 是 n^2 的,可以用分治 FFT 优化。
阅读全文
摘要:分析问题性质,容易得到一个 O(n^2) 做法。考虑对每个 Alice 的起点二分答案。换成整体二分,每次建虚树,在虚树上树形 DP,即可做到 O(n log^2 n)。注意要判断一个节点到 Alice 和 Bob 距离相等的情况,比较复杂。
阅读全文