最長公共子串行
#include
using
namespace std;
typedef
long
long ll;
char a[
1005
], b[
1005];
//pos[i][j]的三個值1,2,3分別表示左、左上和上
//pos記錄當前lcs是從哪個點過來的,如果不等於2說明當前值是繼承自上乙個相等的點
//所以如果不等於2就沿著路徑往回走,一直走到(1,1)點,然後回溯輸出pos[i][j] == 2的點即可
//此方法只能輸出乙個lcs
int dp[
1005][
1005
], pos[
1005][
1005];
void
print
(int i,
int j)
intmain()
}}print
(la, lb)
;putchar(10
);return0;
}
有個很神奇的題目能轉化為lcs。
將給定字串變成回文串所需要插入的最少字元數。
因為回文串正著讀和反著讀是一樣的,所以求正著的和反著的字串的lcs就是當前最長的回文子串行,總長度減去這個的長度就是需要插入的字元,不在回文子串行裡的字元就在對稱位置插乙個就好了。
O nlogn LIS及LCS演算法
morestep學長出題,考驗我們,第二題裸題但是資料範圍令人無奈,考試失利之後,刻意去學習了下優化的演算法 一 o nlogn 的lis 最長上公升子串行 設當前已經求出的最長上公升子串行長度為len。先判斷a t 與d len 若a t d len 則將a t 接在d len 後將得到乙個更長的...
O nlogn LIS及LCS演算法
morestep學長出題,考驗我們,第二題裸題但是資料範圍令人無奈,考試失利之後,刻意去學習了下優化的演算法 一 o nlogn 的lis 最長上公升子串行 設當前已經求出的最長上公升子串行長度為len。先判斷a t 與d len 若a t d len 則將a t 接在d len 後將得到乙個更長的...
LCS 演算法的改進
通常兩個字串的最大公共子串的問題是通過下面的演算法來完成的 把字串1 長度m 橫排,串2 長度n 豎排,得到乙個m n的矩陣c,矩陣的每個元素的值如下,如果m i n j 則c j i 1,否則,c j i 0。然後找出矩陣中連續是1的對角線最長的乙個,則對角線的長度就是公共子串的長度.一看這個方法...