Description
给定两个正整数数列,如果第一个数列中有一个数和第二个数列中的某个数相同,并且都为r,则我们可以将这两个数用线段连起来。我们称这条线段为 r-匹配线段。
我们想要对于给定的输入,找到画出最多匹配线段的方式,并且满足以下条件:
每条a-匹配线段恰好和一条b-匹配线段相交,且a ≠ b。我们称这样的匹配为交叉匹配。
不允许一点多线和一线多交的情况出现:不允许两条线段从同一个数出发,不允许一条线段和多条其它线段相交。
编一个程序对于给定输入数据,计算匹配线段的最多条数。
Sample Input
3
6 6
1 3 1 3 1 3
3 1 3 1 3 1
4 4
1 1 3 3
1 1 3 3
12 11
1 2 3 3 2 4 1 5 1 3 5 10
3 1 2 3 2 4 12 1 5 5 3
Sample Output
6
0
8
本题重点在于如何通过推导和约束,实现时间复杂度的降维。本题的基本推导思想亦借鉴于模板型线性dp:LIS,LCS,LCIS等的推导方法。
首先根据题意,我们要定义 dp[i][j] 表示序列 a[1...i],b[1...j] 中最多匹配线段数。并且 ai,bj 不一定跟其他值构成匹配(所以这一点有别于一般的dp,我们都是要确定当前枚举的这个被选到,才方便转移)。
首先我们可以得到最简单的做法:
- 欲匹配 ai,bj ,于是在 a[1...i−1] 中找到 ak=bj , b[1...j−1] 中找到 bp=ai ,用当前枚举的 { k,p} 内的最大值去更新