1492 交錯匹配 (jzoj)

2021-07-30 02:34:42 字數 1396 閱讀 4939

題目:

題目描述

有兩行自然數,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.

1492 交錯匹配

有兩行自然數,up 1 n down 1 m 如果up i down j k,那麼上行的第i個位置的數就可以跟下行的第j個位置的數連一條線,稱為一條k匹配,但是同乙個位置的數最多只能連一條線。另外,每個k匹配都必須且至多跟乙個l匹配相交且k l!現在要求乙個最大的匹配數。例如 以下兩行數的最大匹配數...

P428 交錯匹配(dp 雙程序)

想到輪船問題了,那邊是不允許相交,這裡是必須且只能與乙個匹配相交。再仔細一想,兩者什麼關係都沒有。f i j 表示up取前i個數,down取前j個數時的最大匹配數,注意,不是i和j匹配。仍然先寫狀態轉移方程 f i j max f i 1 j 1 f i 1 j f i j 1 因為k!l,即兩個交...

棧 字元 匹配(jzoj 1612)

給你乙個長度為n的字串 有多組資料 中間有小寫字母 沒用的東西 和大寫字母,a m是左括號,與之相對的是右括號z n 之所以說是z n而不是n z是因為只有z可以和a相對,只有m可以和n相對 求他是否正確,就是判斷是否有單個括號,括號不匹配,左括號過多,右括號過多的情況,正確輸出1否則輸出012 a...