cross

题目描述
有两行自然数, UP[1..N] DOWN[1..M] ,如果 UP[I]=DOWN[J]=K ,那么上行的第 I 个位置的数就可以跟下行的第 J 个位置的数连一条线,称为一条 K 匹配,但是同一个位置的数最多只能连一条线。另外,每个 K 匹配都必须且至多跟一个 L 匹配相交且 KL !现在要求一个最大的匹配数。

例如 :以下两行数的最大匹配数为 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值