cf463d】的更多相关文章

这题说的是给了k个串算出这k个串的最长公共子序列,这k个串每个串都是由1--n的数字组成的. 将第一串的数字按照顺序重新编号为123...n 然后后面的串按照这个编号重新标号,就转化为下面每个串大最长递增子序列的问题,然后我们对于每个串计算出后面比他大的数然后建一条边(用邻接矩阵存)然后可以判断出从a到b点是否有k-1条这样我们专门挑那些k-1条的走这样保证每个序列中都有这样最后dfs算出最长的那个 #include <iostream> #include <cstdio> #in…
题目大意:给你$k(2\leqslant k\leqslant5)$个$1\sim n(n\leqslant10^3)$的排列,求它们的最长子序列 题解:将$k$个排列中每个元素的位置记录下来.如果是公共子序列,那么这些数的位置在$k$个排列中都是递增的,然后就变成了一个$k$维偏序问题. 因为$n\leqslant10^3$,所以可以用$O(n^2k)$的$DP$来做 卡点:看成了最长公共上升子序列,然后一直挂 C++ Code: #include <cstdio> #define maxn…
给定 $n<=10$ 个 $1$~$n$ 的排列,求这些排列的 $LCS$. 考虑两个排列怎么做:以第一个序列为基准,将第二个序列的元素按照该元素在第一个序列中出现位置重新编号. 然后,求一个 $LIS$ 即可. 现在是多个串,不妨也按照这个方法来做: 以第一个串为基准,其余串重新编号成该元素在第一个串中的出现位置. 那么,如果一个序列是 $n$ 个序列的 $LCS$,则满足两个条件: 1: 是重现编号后的 $LCS$ 2: 这个 $LCS$ 还需是一个 $LIS$. 多了第二个限制,问题就简单…