傳送門
這道題lcs。
o(n^2)暴力不僅會tle還會re。
暴力的話就是dp的那個式子。
這裡給出對數時間處理的:
我們記錄陣列a的每個元素所在的下標,即把下標和對應的元素內容進行調換,得到pos。
然後我們把pos陣列和b陣列進行操作,查詢b[i]在pos中對應的位置(即在a中對應的位置)。
求出pos陣列的lis(最長上公升子串行)。長度就是最長公共子串行的長度。
因為我們的b陣列是按順序操作的,目的是想在b中找到最長的公共子串行,那麼對應到a中的位置應該是遞增的,所以這裡就產生了pos陣列。用lis方法求得即可。
**部分:
#include
using
namespace std;
const
int n =
1e5+10;
int a[n]
;int b[n]
;int pos[n]
;int d[n]
;int n;
intmain()
for(
int i =
1; i <= n; i++
)int len =0;
for(
int i =
1; i <= n; i++
)else
} cout << len << endl;
return0;
}
P1439 模板 最長公共子串行
給出1 n的兩個排列p1和p2,求它們的最長公共子串行。第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。乙個數,即最長公共子串行的長度 輸入 1複製 5 3 2 1 4 5 1 2 3 4 5輸出 1複製 3 資料規模 對於50 的資料,n 1000 對於100 的資料,n 1...
P1439 模板 最長公共子串行
p1439 模板 最長公共子串行 這個題目我是沒想到反正我感覺十分的神奇先寫一下我在洛谷題解區看見的乙個很好理解的題解 對於樣例 3 2 1 4 5 1 2 3 4 5 我們可以把第乙個陣列編號位a b c d e 那麼第二個陣列就變成了c b a d e 現在對於第二個陣列的最長上公升子串行就是答...
P1439 模板 最長公共子串行
給出1 n的兩個排列p1和p2,求它們的最長公共子串行。輸入格式 第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。輸出格式 乙個數,即最長公共子串行的長度 輸入樣例 1 複製 5 3 2 1 4 5 1 2 3 4 5 輸出樣例 1 複製 3 資料規模 對於50 的資料,n 1...