題目:
題目描述
有兩行自然數,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...