题目:
题目描述
有两行自然数,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
var a,b:array[-1..202] of longint;
f:array[-1..202,-1..202] of longint;
n,m,i,j:longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
procedure bool(x,y:longint);
var xa,xb:longint;
begin
xa:=a[i]; xb:=b[j];
dec(x); dec(y);
while (a[x]<>xb)and(x>0) do dec(x);
while (b[y]<>xa)and(y>0) do dec(y);
if (x>0)and(y>0)and(a[x]<>b[y]) then
f[i,j]:=max(f[x-1,y-1]+2,f[i,j]);
end;
begin
assign(input,'cross.in');
assign(output,'cross.out');
reset(input);
rewrite(output);
read(n,m);
for i:=1 to n do read(a[i]);
for i:=1 to m do read(b[i]);
for i:=1 to n do
for j:=1 to m do
begin
f[i,j]:=max(f[i-1,j],f[i,j-1]);
bool(i,j);
end;
write(f[n,m]);
close(input);
close(output);
end.