闲扯
这场考试全是 $dp$ ,都是看出来了,但是写不来转移。。。
题面
见 $ftp$
$T1$
Solution
我们有一个很暴力的想法,设 $dp_{i,j}$ 表示数组 $A$ 走到第 $i$ 个,数组 $B$ 走到第 $j$ 个,且以 $i,j$ 为结尾的合法子序列的数量。
然后我们枚举 $i,j$ ,每次找到一组 $A_i=B_j$ 时,我们枚举所有的 $s,l$ ,满足 $s<i,l<j,A_s=B_l,lt_{A_s,A_i}$ ,将它们的状态转移给 $dp_i,j$ 。
这样做的时间复杂度是 $O(n^4)$ 的,需要考虑优化。
我们设一个 $f2$ 数组,其中 $f2_i$ 表示所有以 $i$ 结尾的公共子序列的方案数之和。
再设一个变量 $sum$ 表示对于当前的 $i$ ,所有的满足 $lt_{B_j,A_i}$ 的 $j$ 的 $f2$ 的和,更新时直接用 $sum$ 来更新 $dp_{i,j}$ 即可。
对于 $f2,sum$ 我们都是可以 $O(1)$ 转移的,这样时间复杂度就优化成了 $O(n^2)$ 。
Code
1 |
|
$T2$
Solution
这题属于出题人的问题,题面没有保证限制是否合法,样例也没有给,真的是服了。
排去所有的不合法的点,用所有的可用的边转移即可。
Code
1 |
|
$T3$
Solution
我们设 $dp_i$ 表示覆盖了 $1\sim i$ 的权值和。
我们先对所有的区间按照左区间从小到大排序,如果第 $1$ 个区间的左端点不是 $1$ ,那么一定是无解的,我们直接输出 $0$ 即可。
考虑怎么转移。
对于一个端点为 $l,r$ 的区间,一定能从 $j\in[l-1,n]$ 转移。
- 对于 $j\in[l-1,r]$ ,我们转移到 $dp_r$ 。对于 $dp_r$ ,我们需要加上一个权值 $sum_{l-1,r}\cdot val$ 。其中 $sum_{i,j}$ 表示右端点在 $\sum_{k=i}^j dp_k$ 。
- 对于 $j\in[r+1,n]$ ,我们转移到 $dp_j$ 。对于 $dp_j$ 我们直接乘上一个 $val+1$ ,表示在之前的所有情况上,我们再多选一个当前区间或者保持不变。
然后就可以直接上线段树优化了。
时间复杂度: $O(m\log n)$ 。
Code
1 |
|
总结
$dp$ 已经忘了。。。