之前没想着要放上来的,但是为了方便查看还是放上来吧。
现在时间是省选 Day 0。
P7154
需要按照大小匹配的问题不妨转化成括号序列。对于所有的奶牛和牛棚排序,位置相同奶牛在前。
把所有牛棚看作是右括号,奶牛看作左括号,然后进行括号匹配。最后对于所有“失配”的括号必须满足失配的最左侧的左括号在失配的最右侧的有括号的右边。
设 \(f_{i,j,0/1}\) 表示目前匹配到了 \(i\) 这个位置,有 \(j\) 个左括号正在等待被匹配,并且之前是否已经有过失配的左括号了。
\(i\) 是左括号:
- 将 \(i\) 放到带匹配的当中,\(f_{i,j,0/1}\leftarrow f_{i-1,j-1,0/1}\)
- 将 \(i\) 设为不被匹配的,\(f_{i,j,1}\leftarrow f_{i-1,j,0}+f_{i-1,j,1}\)
\(i\) 是右括号
- 将 \(i\) 匹配之前的一个左括号,\(f_{i,j,0/1}\leftarrow f_{i-1,j+1,0/1}\times (j+1)\)
- 将 这时候之前一定要是没有过未被匹配的左括号 \(f_{i,j,0}\leftarrow f_{i-1,j,0}\)
答案即为 \(f_{2n,0,0}+f_{2n,0,1}\)。
整体的思路感觉是清晰而且自然的。
CF1188 C
比较神奇的观察性质(之前感觉都没有碰到过太多这种套路)
注意到一点,如果选择一个长度为 \(k\) 的序列,其最大的贡献就是 \(\lfloor \dfrac{\max a-\min a}{k-1}\rfloor\)。因为注意到我们要尽量增大两个数之间的间隔,因此贪心就可以得到答案。
这个东西随着 \(k\) 的增大范围会越来越小,考虑枚举这个贡献,设为 \(lim\)。计算有多少情况大于等于这个贡献,然后减去 \(lim+1\) 就可以查分得到恰好是这个贡献的数量了。
设 \(f_{i,j}\) 表示对于 \(a\) 排序之后,目前强制选择 \(a_i\),并且一共选择了 \(j\) 个的情况数,有转移:
\[f_{i,j}=\sum_{k,a_i-a_k\ge lim}f[k][j-1] \]这个东西显然可以用双指针 + 前缀和优化一下做到 \(\mathcal{O}(nk)\) 的。然后之前的枚举部分是 \(\mathcal{O}(\dfrac{\max a}{k})\) 的,会惊奇地发现乘起来就是 \(\mathcal{O}(n\max a)\) 可以通过。
LOJ 3575
先看看哪个好做,显然是尽量多匹配的好做(因为这样就可以忽略一定要是一个完全匹配的条件)。
这个比较容易,设 \(f_{i,j}\) 表示考虑到第一种奶牛的第 \(i\) 个,第二种奶牛的 \(j\) 个。有以下几个转移:
- 下一个 \(i\) 不匹配 \(f_{i,j}\to f_{i+1,j}\)
- 下一个 \(j\) 不匹配 \(f_{i,j}\to f_{i,j+1}\)
- 下一个 \((i+1,j+1)\) 可以匹配,\(f_{i,j}+w_{x_{i+1}}+w_{y_{j+1}}\to f_{i+1,j+1}\)
可以这样转移的原因是我们发现一定不会交叉转移,即不会出现 \(i\to j+2,i+1\to j+1\) 这种形式的匹配,因为这样一定是不优的。这个结论比较重要,因为在考虑完全匹配的时候也要用到这个性质。
接下来考虑尽量少匹配,从比较简单考虑开始,我们可以想到一个 \(\mathcal{O}(n^3)\) 的状态定义:\(f_{i,j,k}\),前两维一样,最后一位记录一下上一个放弃匹配的位置。那么对于现在的位置我们可以放弃当且仅当要么这个位置和上一个放弃匹配的种类相同,要么是两者距离大于 \(K\),否则其他的情况一定会导致这两个匹配上。
下一步就是大部分进阶难度的 dp 题难点,就是对于状态的优化,前两个维度优化不太行,思考一下最后一维是不是可以优化。观察一下限制,我们比较在意的是没有匹配到的种类是什么,记录 \(f_{i,j,0/1}\) 表示这个状态。
考虑转移,有三个比较显然的转移(注意:这里的 \(f\) 和第一个问题的 \(f\) 意义是相反的:
- 下一个第一种不匹配,那么目前一定要是第一种没有被匹配 \(f_{i,j,0}+w_{x_{i+1}}\to f_{i+1,j,0}\)
- 下一个第二种不匹配,那么目前一定要是第二种没有被匹配 \(f_{i,j,1}+w_{y_{j+1}}\to f_{i,j+1,1}\)
- 下一对匹配 \(f_{i,j,0/1}\to f_{i+1,j+1,0/1}\)
最后考虑切换状态,发现不能简单地从 \((i,j)\) 往 \((i+1,j+1)\) 转移了。假设我们现在是留着第一种没有选择,那我们要切换到第二种,那么要找到第一个位置满足 \((i+1,j+1),(i+1,j+2)\dots (i+l,j+l)\) 匹配,而且 \(j+l+1\) 于 \(i\) 的位置差距大于 \(K\)。这时候我们就可以切换状态了,因为这两个位置是无法和任何东西匹配的,可以都被放弃。
注意到后面这个东西是可以预处理的,也就是可以做到 \(\mathcal{O}(n^2)\)。
还是有不少思维含量的题目。
CF1178F2
来点区间 dp。
发现“每次染色区间之前不能有相同颜色”这个限制是相当严格的,也就是说我们染色了一段区间 \([l,r]\) 之后 \((l,r)\) 这段东西就和外面的东西独立了,里面出不去,外面进不来。
考虑设 \(f(l,r)\) 表示考虑 \([l,r]\) 这段区间的方案数,首先需要排除一些不合法的状态,即这段区间中存在一个颜色且外面也存在这种颜色。这种情况下,这个区间一定不能是独立出来的。
因为我们是按照顺序染色,我们找到这个区间最小出现的数字(颜色),找到其最左和最右的位置,令值 \(lp_x,rp_x\)。中间的不需要考虑,或者说,会在转移的时候进一步递推到。
首先 \((lp_x,rp_x)\) 这一段一定是独立出来了,因为这个颜色是先染的, 也就是说不可能有颜色跨过其左端点或者右端点。之后我们枚举染这个区间的时候的左右端点,设为 \([l',r']\)。注意这时候的 \(l'\le lp_x,r'\ge rp_x\) 是一定要满足的。
我们只考虑左边,这时候还会发分成两段,一段是 \([l,l')\) 另一段是 \([l',lp_x)\) 这两段因为这次的染色会被独立。直接枚举 \(l'\) 然后计算即可,右侧同理(而且与左侧独立,即可以单独计算)。
总复杂度 \(\mathcal{O}(m^2n)\) 等下,有点不对 \(m\) 太大了,不能接受。再回到那个苛刻的条件,首先我们可以把同一段的东西合并成一种颜色,但是这仍然可能很大,比如说 \(1212121\) 这种样子,但是仔细思考一下,这种情况真的能够出现吗?每一次染色,我们最多会在两个端点造成一次的颜色变化,也就是说,我们最多造成的颜色变化数应该是 \(2n\) 的,这就意味着,如果合并之后 \(m>2n\) 是一定不合法的。
这样就成功把复杂度降到 \(\mathcal{O}(4n^3)\) 可以通过(而且明显跑不了这么满)。
LOJ 3569
这个有意思的套路居然第二次遇到了。
说实话对于这个套路感觉理解地还不是很透彻,但是又开始逐渐理解了。
这种在一个数轴上面填数字的题,直接维护坐标是非常不可做的,但是我们考虑维护形成了多少个联通块,或者说多少个连续段,以及总连续段的长度。连续段的定义可以是,这几个磁铁合成一块了,之后在他们中间插任何磁铁了。
设 \(f_{i,j,l}\) 表示(按照半径从小到大的顺序)考虑到 \(i\) 个磁铁,目前总共的连续段数量是 \(j\),总共连续段的长度是 \(l\)。感觉理解这个的关键点在于,我们不是很关心他们具体在哪里。转移有:
- 这个点新开一个连续段 \(f_{i,j,k}\times (j+1)\to f_{i+1,j+1,k+1}\)。新开一个位置可以在任何两个连续段之间开,或者是头尾,即有 \(j+1\) 种选择。之后因为只是一个点,连续段总长度只会 \(+1\)。
- 这个点合并到之前一个连续段的左边或者是右边 \(f_{i+1,j,k}\times 2j\to f_{i,j,k+r_i}\) 每个连续段都有两边可以合并,合并之后由于要算上这个磁铁的半径,因此总长度 \(+r_i\)。
- 这个点连接两个连续段 \(f_{i,j,k}\times (j-1)\to f_{i+1,j-1,k+2r_i}\) 和上一个基本是一样的理解。
这个东西有点难理解,大概可以认为,我们先不考虑两个段之间相互吸引的情况,但是当我们合并的时候(因为答案最后肯定要合并成一个连续段),我们就会考虑到这种情况了。
最后,我们肯定只能是一个连续段,而且加入我们的长度是 \(l\),对于总长度是 \(L\) 的情况,还剩下一些空位,这些空位随意的插入,即有 \(\binom{L-l+n}{n}\) 种方法。
回去看一眼 ABC313Ex,这个其实是一个道理,看看现在能不能够更好理解了。
非常好,故题重做理解了。
P8352
来点 dp 套 dp。其实这个东西没有那么恐怖。
这个题如果每个点是确定的就是一个简单的树形 dp,设 \(f_{u,0/1}\) 表示这个点选择或者不选择的情况,然后直接转移即可,复杂度是 \(\mathcal{O}(n)\) 的,但是要枚举每一个点的权值,不太行。
这个时候我的考虑是设 \(g_{u,r,0/1}\) 表示,对于这个点,其结果是 \(r\) 且其选择或者不选择的方案数。看了题解之后发现自己的思路是非常正确的,但是这个状态设计地有点别扭,不妨直接设 \(g_{u,p,q}\) 表示对于这个点 \(f_{u,0}=p,f_{u,1}=q\) 的情况。转移是这样的:
\[g_{u,i,j}\times g_{v,x,y}\to g_{u,i+\max(x,y),j+x} \]其实这里就已经就是 dp 套 dp 的形式了,外面是一个大的背包,里面是一个小的 dp 转移。
但是这个东西并不能通过,因为其状态就已经是 \(\mathcal{O}(n^3k^2)\) 的了,还要背包。
这题关键的点在如何化简状态,其实所有 dp 都在于此,观察一下我们需要的东西有什么,我们需要的是 \(f_{u,0}\) 和 \(\max(f_{u,0},f_{u,1})\)。观察一下这两个东西这两个东西的差距一定是 \([0,val_u]\) 范围的。因为如果最大值取 \(f_{u,1}\) 那么把 \(u\) 点扔掉不选一定是一个合法的情况,也就是说这样宽松地考虑发现其差距最多是 \(val_u\) 即 \(k\) 的。
那么下一步就呼之欲出了,记录 \(g_{u,p,d}\),后面两维表示 \(f_{u,0}=p,\max(f_{u,0},f_{u,1})=p+d\)。这样状态就下来了,转移还是一个道理。
\[g_{u,i,j}\times g_{v,x,y}\to g_{u,i+x+y,\max(i+x+y,i+j+x)-(i+x+y)} \]这也是一种比较经典的化 \(\Delta\) 的 dp 优化方法。
由于这种复杂度不是最优的复杂度,因此需要一些适当的卡常,如 \(0\) 特判,取模优化,不开 longlong
等。
CF932 F
这个题就偏向板子了,但是写一下还是有不少收益的。
转移的式子是好推的,即 \(f_{u}=\min f_v+a_ub_v\) 注意到 \(f_v,b_v\) 都是在子树的计算过程中计算过的,那么这就是一个斜率优化的形式。直接上李超线段树。
但是对于每一个节点不能直接重新建一个李超,不然会爆炸,但是一个点是吸取所有子几点的最优值,也就是说可以直接线段树合并。有两个细节:
- 由于 \(kx+b\) 的 \(x\) 可能取负数,因此需要整体加一个数,询问 + 计算的时候减去即可
- 李超线段合并的过程每次合并两个点需要把其中一个点的信息当作一个新的直线插入另一个线段树中,即 \((tr[y].k,tr[y].b)\to x\),这样可以做到信息的保留。
没带电脑来学校,学校刚好又在做 dp 专题,随便记一下。
P5504
做点决策单调性的东西,之前那个里面似乎没有。
感觉难点在于观察出来性质,会发现每次分割的区间会满足两个条件
- 左右端点的大小一定相等
- 选择的 \(s_0\)
这个不难证明(由于某软件突然闪退了,东西没了)。
这样就有转移,设 \(p_i\) 表示这个贝壳是与其同大小的第 \(p_i\) 个:
\[f_i=\max_{c_j=c_i,j<i}f_{j-1}+s_i\times(p_i-p_j+1)^2 \]这个状态看起来已经非常简洁了,考虑在转移上面下功夫。
如果设 \(F_i\) 表示在 \(i\) 上面的最有转移点,那么对于同一个颜色的贝壳,\(F_i\) 一定是s_i\times单调不增的。即如果 \(i<j,s_i=s_j\) 那么从某一个时刻 \(i\) 的转移比 \(j\) 优了,之后会一直比其优。观察转移式就可以得到。
如此就可以维护一个单调栈,通过二分判断什么时候会比上一个栈顶劣。
具体操作还是有一点细节的,对于单调栈的操作应该如下:
- 如果栈顶的元素能够持续贡献到 \(x\),之后就会被上一个元素覆盖,再如果当前元素相对于栈顶的元素能够贡献到 \(y\)。如果 \(y>x\) 那么栈顶的元素应该被弹出。因为这个元素贡献的过程已经可以完全包括栈顶元素贡献的过程了
- 将当前元素塞入栈中
- 考虑栈顶的元素是否是比上一个元素优,这里针对的是当前的位置,也就是栈顶元素能不能贡献到这个位置
- 进行 dp 转移
P3592
区间 dp, 感觉不算太难,要有胆量。
首先显然的每个位置一定是 \(c_i\) 的某一个数,不然不会最优。也就是说每个位置能够填的数字就是 \(\mathcal{O}(m)\) 范围的。
直接暴力区间 dp 设 \(f_{l,r,k}\) 表示在 \([l,r]\) 区间内,最小值是 \(k\) 的时候的最小值。转移有:
\[f_{l,r,k}=\max_{p,X\ge k,Y\ge k} f_{l,p-1,X}+f_{p+1,r,Y}+cnt(l,r,k,p)\times k \]其中的 \(cnt\) 就是在这个区间内有多少个跨过 \(p\) 的区间且其可以选择 \(k\)。左边连个转移可以后缀 \(\max\),\(cnt\) 遍历的时候处理,这样就可以做到大力 \(\mathcal{O}(n^3m)\),是可以通过的。
StringWeight
比较精巧的一道题。
对于一个轻的字符串,显然如果长度小于26那就是每一个字符出现一次,如果大于26,每一个字符一定是出现在连续的一段当中的。
对于题目要求的东西,我们其实只关心每一个字符的起始节点和终止节点。
设一个四元组:\((k,c,p,u)\) 表示考虑当前的字串,有多少个字符
-
\(k\):只出现在当前的字符串中
-
\(c\):第一次出现在总串中(显然后面还要再次在别的字串中出现过)
-
\(p\):最后一次出现在总串中,即 \(c\) 的闭合
-
\(u\):路过,即在 \(p,c\) 中间。
对于一个四元组,我们发现可以 \(\mathcal{O}(1)\) 算出来其对于答案的贡献,具体来说,分析 \(u>0,u=0\) 之后贪心即可。那么就可以设 \(f_{i,new,open}\) 表示考虑这个位置,有多少个还从来没有用过的字符,和有多少个还没有闭上的字符。推导一下转移即可。
CF868E
首先显然一定有解,实在不行警察硬着头皮一个小偷一个小偷抓,因为是在一棵树上一定能够抓到。些简单的观察发现,小偷苟在叶子节点一定是不错的选择,这样可以甩警察尽可能远。
反过来想,警察每次抓到小偷一定是在一个叶子节点。这时候可能还会剩下一些小偷,由于警察是在一个叶子节点,那么剩下小偷可以趁这个时间随意调整位置,让警察再次出发的时候消耗时间最多。因为可以随意移动,我们不妨设 \(f_{u,i}\) 表示警察目前在 \(u\) 这个叶子节点,还剩下 \(i\) 个小偷,他们调整完之后警察最短多少时间可以抓到小偷。
状态很理想,考虑如何转移。假设剩下的每个叶子节点的小偷数量已经确定了,为 \(c_u\),转移式就应该是 \(f_{u,i}=\min\limits_{v\in leaves,u\neq v}dis(u,v)+f_{v,i-c_v}\)。而此时小偷还有机会调整每一个位置的 \(c_u\),所以这个转移还不确定。反过来考虑问题,小偷希望 \(f_{u,i}\) 尽可能大,那么直接二分这个值,然后判断小偷能不能构造出来一种方案达到这种值。设目前二分的值为 \(lim\),检查的时候贪心,在满足 \(dis(u,v)+f_{v,i-c_v}\ge lim\) 的条件下让 \(c_v\) 尽可能大。
最后统计答案,由于起始的位置不一定是叶子,但是这影响并不大,因为这个条件对于小偷的唯一限制就是一个小偷不能跑出其所在的子树。那么开始的时候记录一下每一个子树中小偷总数然后再贪心即可。
复杂度 \(\mathcal{O}(n^4\log ans)\) 其实还可以优化,因为 \(f_{u,i}\) 随着 \(i\) 增大是单调递增的,找 \(c_v\) 最优解的时候也可以二分。
CF726F
发现 \(|T|\) 的很小,不难想到状压。
设 \(f_{u,i,A}\) 表示考虑 \(S\) 的 \(u\) 子树,对于 \(u\) 其映射到 \(i\) 点,并且此时考虑了 \(|T|\) 的 \(A\) 集合的点的总方案数。这个转移是好做的,有点类似于背包:
\[f_{u,i,A}\times f_{v,j,B}\to f_{u,i,A\cup B} \]其中只需要保证 \(T\) 中有 \((i,j)\) 的边,而且 \(A\cap B=\emptyset\) 即可。然后减枝即可。
P5336
感觉这个区间 dp 挺神秘的。
首先是区间 dp 显然的。不妨先设 \(ans_{l,r}\) 表示这个区间的转移,但是发现只有这两个条件是不够转移的,对于一个区间的选择,我们需要知道的是其最大值和最小值。可以这样设计状态:
\(f_{l,r,a,b}\) 表示这个区间经过若干次选择之后还剩下的元素最大值是 \(a\) 最小值是 \(b\) 的代价。那么对于答案应该有 \(ans_{l,r}=\min_{a,b}(f_{l,r,a,b}+A+B\times (a-b)^2)\)
再思考对于 \(f_{l,r,a,b}\) 如何转移,这就是一个普通区间 dp 的形式。因为每个取走的部分是独立的,有三种转移:
- \(f_{l,r,a,b}=\min ans_{l,k}+f_{k+1,r,a,b}\) 左边直接全部扔掉并付出代价,右边余下满足最大最小值的条件
- \(f_{l,r,a,b}=\min f_{l,k,a,b}+ans_{k+1,r}\) 同上
- \(f_{l,r,a,b}=\min f_{l,k,a,b}+f_{k+1,r,a,b}\) 也是一样的,这时候是两个部分拼起来的。
LOJ 6240 + CF235 D
好题!还是很有趣的题,虽然感觉其实算不上 dp。
先看后面这个题,关键在与拆贡献。注意到每个点都会被当作点分治的中心,也就是需要统计每个点作为点分治中心时所属联通块大小的期望值。
更进一步,其实是需要计算有多少个点和这个点联通。这时候我们考虑暴力枚举点分治中心 \(u\),其他的所有点 \(v\)。设 \(p(u,v)\) 表示在 \(u\) 为点分治中心时,\(v\) 与 \(u\) 相连的概率。那么对于 \(u\) 点的答案就是 \(\sum_v p(u,v)\)。最后答案就是 \(\sum_u\sum_vp(u,v)\)。
先思考在树上的时候怎么计算 \(p\)。如果在 \(u\) 为点分治中心的时候 \(v\) 与之联通,那么答案就应该是 \(\frac{1}{dis(u,v)}\)。原因是 \(u\) 要先于这条路径上所有点删除。如此树上的问题就解决了。
那么基环树呢?如果两个点只有一条路径相互到达就是平凡的,和上面计算方法一样。否则,设一种方案的长度是 \(x\) 另一种方案长度是 \(y\)(因为是基环树所以只会有两种方案)。同样和上面分析,要么是 \(u\) 在 \(x\) 路径上先被删掉,要么是 \(y\) 路径上先被删掉。因此应该是 \(\frac{1}{x}+\frac{1}{y}\)。但是注意到这会算重,也就是即是 \(x\) 又是 \(y\) 上面第一个被删掉的概率。因此设两者的并集的总长度为 \(z\) 那么答案应该是 \(\frac{1}{x}+\frac{1}{y}-\frac{1}{z}\)。
进一步到仙人掌上。这时候 \(u\to v\) 可能有很多条路径了,但是所有路径一定长成大改是这样:
与基环树的思路类似,我们选定一些连接这两个点的路径,并设其并集为 \(S\)。那么贡献应该是 \(\frac{1}{|S|}\)。但是这个贡献因该是还有一个系数的,经过一些手玩(这部分真的不会证明),发现这个系数就是 \(k^{-1}\) 其中 \(k\) 是 \(S\) 中环的数量。
之后就简单了,设 枚举起始点后,设 \(f_{v,i}\) 表示到 \(v\) 的贡献综合。在圆方树上 dp 即可。
AGC002F
学校的 dp 专题,顺手来写一下。
(现在才发现我的标题有时候是 H2 有时候是 H3,难绷)
优化状态题,显然不可能记录每一个球放了几种,这样还需要带着下标(因为每一次只放一个)是无法接受的,那么考虑每一次一次性放完一整个颜色,思路就变得清晰起来了。
首先要确定白色球的情况,会发现白色球和其他的球是不会相互影响的,唯一的限制就是对于任何一个位置,前缀白色球的数量一定要大于出现颜色的数量。不妨设 \(f_{i,j}\) 表示目前已经放了 \(i\) 个白色球和 \(j\) 种颜色球。
转移不难,唯一要注意的是,我们需要钦定当前放的球一定要在没有放置位置的第一个位置,这也是比较经典的套路了,为的就是避免算重。
首先一定有 \(f_{i,j} \leftarrow f_{i-1,j}\),在第一个位置放一个白色球。之后考虑其他颜色,那就是简单的组合数计算,注意要 \(-2\) 一个是白色的,另一个是固定位置的。综合起来就是(注意要保证 \(i\ge j\))。
\[f_{i,j} \leftarrow f_{i-1,j} + f_{i,j-1} \times f_{i,j-1} \times (n-j+1)\times \binom{nk-i-(k-1)\times (j-1)-1}{k-2} \]注意这种计算方式需要特判 \(k=1\) 的情况,这时候答案应该是 \(f_{n,0}\) 也就是 \(1\),因为显然 \(\forall i\in [0,n],f_{i,0}=1\)。
感觉评分高了。
CF1775F
对于 \(u=1\) 可以直接二分答案,因为构造方法一定是把这 \(n\) 个点塞到一个矩形当中的,如果答案确定之后相当于确定 \(2(a+b)\) 求 \(\max ab\) 差小积大即可。
对于 \(u=2\) 首先需要枚举长宽,注意到几个事实,首先合法的长宽组数一定是 \(\sqrt{n}\) 级别的,对于每一种长宽,考虑构造。为了保证是一个不是一个凹图形,考虑从4个角上扣掉一些。这里又有两个性质,首先扣掉的数量也是 \(\sqrt{n}\) 级别的,并且扣掉的部分一定是相互独立的(如果不独立那么显然会空出来一行或者一列)。
那么现在变成计算,令 \(f(x)\) 表示抠出来 \(x\) 的方案数,这玩意要和自己卷积 \(4\) 次,卷积可以暴力卷积,因为是 \(\sqrt{n}\) 级别的。那么具体求 \(f(x)\) 是一个经典问题,相当于要求一个数字和为 \(x\) 的不降序列有多少个,我之前似乎也遇到过很类似的一个题需要用到这个 \(f(x)\),ATC 里的但是忘记了,反正是一个经典套路。要么在第一位 \(+1\) 要么全局 \(+1\) 即 \(dp_{i,j}=dp_{i-1,j-1}+dp_{i,j-i}\)。
预处理 \(dp\)、\(f\) 的卷积即可。然后二分之后枚举长宽。
注意到 \(\sqrt{n}\) 和发现是从四个角上面扣是关键。
CF1602F
感觉这种需要一点性质的 dp 还是不太行啊。
本人第一反应是找到最大数然后推,其实感觉方向也没有太离谱,但是就不是很优秀。然后就有点卡住了。
正确姿势是注意到有偏序关系即如果有 \(a\to b\to c\) 那么就一定会出问题,因为一定也有 \(a\to c\)。
这个限制优秀在于其限制性非常强。这导致的结果是原序列变限制成必须是两个上升子序列合并出来的。而且贪心一点想,这两个上升子序列就是两个不相交的单调递增的折线。
之后就不难了,考虑 \(i\) 怎么填,因为其一定放在一个子序列的末尾,也就是说我们并不需要记录两个子序列分别当前末尾分别是什么,我们只需要记录当前位置为正或者负数的时候,另一个子序列的末尾是什么。显然我们想要子序列的末尾越小越好,贪心即可。
标签:这个,匹配,一个,times,DP,转移,dp,Pack From: https://www.cnblogs.com/Jryno1-blog/p/18047961