想到輪船問題了,那邊是不允許相交,這裡是必須且只能與乙個匹配相交。
再仔細一想,兩者什麼關係都沒有。
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,即兩個交叉的匹配的數字不能相同,故當up[i]==down[j]時不執行匹配。
假設存在kup,滿足在doan的前j個數中,down[kup]==up[i]且kup距離j最近。
假設存在kdown,滿足在up的前i個數中,up[kdown]==down[i]且kdown距離i最近。
則,當up[i]!=down[j]時: f[i][j]=max(f[i][j],f[kup-1][kdown-1]+2);
即up[i]與down[kup]匹配,down[j]與up[kdown]匹配。
如何求kup以及kdown?最暴力的做法是在狀態轉移的過程當中每次搜一遍,o(n^4),很危險。所以我們要預處理。
在這裡採用了o(n^2)的預處理,看了幾個同學的**,思路好像還挺多的。
void first_()
void init()
void work()
printf("%d",f[n][m]);
}
1492 交錯匹配
有兩行自然數,up 1 n down 1 m 如果up i down j k,那麼上行的第i個位置的數就可以跟下行的第j個位置的數連一條線,稱為一條k匹配,但是同乙個位置的數最多只能連一條線。另外,每個k匹配都必須且至多跟乙個l匹配相交且k l!現在要求乙個最大的匹配數。例如 以下兩行數的最大匹配數...
1492 交錯匹配 (jzoj)
題目 題目描述 有兩行自然數,up 1.n down 1.m 如果up i down j k,那麼上行的第i個位置的數就可以跟下行的第j個位置的數連一條線,稱為一條k匹配,但是同乙個位置的數最多只能連一條線。另外,每個k匹配都必須且至多跟乙個l匹配相交且k l!現在要求乙個最大的匹配數。例如 以下兩...
4 28 洛谷 P1629 郵遞員送信
有乙個郵遞員要送東西,郵局在節點 1。他總共要送 n 1 樣東西,其目的地分別是節點 2 到節點 n。由於這個城市的交通比較繁忙,因此所有的道路都是單行的,共有 m 條道路。這個郵遞員每次只能帶一樣東西,並且運送每件物品過後必須返回郵局。求送完這 n 1 樣東西並且最終回到郵局最少需要的時間。輸入 ...