var f:array[0..101,0..101] of longint; a,b:array[0..101] of longint; dnum,dx,n1,n2,i,j,p,q:longint; function max(a,b:longint):longint; begin if a>b then exit(a); exit(b); end; begin readln(dnum); for dx:=1 to dnum do begin fillchar(f,sizeof(f),0); readln(n1,n2); for i:=1 to n1 do read(a[i]); readln; for i:=1 to n2 do read(b[i]); readln; for i:=1 to n1 do for j:=1 to n2 do begin f[i,j]:=max(f[i-1,j],f[i,j-1]); if a[i]=b[j] then continue; for p:=i-1 downto 1 do if a[p]=b[j] then break; if a[p]=b[j] then begin for q:=j-1 downto 1 do if b[q]=a[i] then break; if b[q]=a[i] then f[i,j]:=max(f[i,j],f[p-1,q-1]+2); end; end; writeln(f[n1,n2]); end; end.
题意:给出两行数,求上下匹配的最多组数是多少.
匹配规则
1.匹配对的数字必须相同
2.每个匹配必须有且只能有一个匹配与之相交叉,且相交叉的两组匹配数字必须不同
3.一个数最多只能匹配一次
分析:DP.f[i,j]表示上面到i,下面到j的匹配对数.
f[i,j]=max(f[i-1,j],f[i,j-1],max{f[p-1,q-1]+2} (a[p]=b[j] & b[q]=a[i])).
code: