1492. 交错匹配 (File IO): input:cross.in output:cross.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto ProblemSet 题目描述 有两行自然数, UP[1..N] , DOWN[1..M] ,如果 UP[I]=DOWN[J]=K ,那么上行的第 I 个位置的数就可以跟下行的第 J 个位置的数连一条线,称为一条 K 匹配,但是同一个位置的数最多只能连一条线。另外,每个 K 匹配都必须且至多跟一个 L 匹配相交且 K≠L !现在要求一个最大的匹配数。 例如 :以下两行数的最大匹配数为 8 输入 从文件 CROSS. in 读入数据,第一行有两个正整数 N 和 M 。第二行 N 个 UP 的自然数,第三行 M 个 DOWN 的自然数。其中 0<N 、 M<=200 , UP 、 DOWN 的数都不超过 32767 。 输出 最大匹配数输出到CROSS.OUT。 样例输入 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 样例输出 8 数据范围限制 uses math; var a,b,c,i,j,k,k1:longint; v,r:array[0..200]of longint; f:array[0..200,0..200]of longint; begin assign(input,'cross.in');reset(input); assign(output,'cross.out');rewrite(output); readln(a,b); for c:=1 to a do read(v[c]); for c:=1 to b do read(r[c]); for i:=1 to a do begin for j:=1 to b do begin f[i,j]:=max(f[i-1,j],f[i,j-1]); if v[i]=r[j] then continue; for k:=i-1 downto 1 do begin if r[j]=v[k] then break; end; if r[j]<>v[k] then k:=0; for k1:=j-1 downto 1 do begin if v[i]=r[k1] then break; end; if v[i]<>r[k1] then k1:=0; if (k>0)and(k1>0) then f[i,j]:=max(f[i,j],f[k-1,k1-1]+2); end; end; writeln(f[a,b]); close(input); close(output); end.