洛谷 P1439 模板 最長公共子串行

2021-08-14 19:45:21 字數 1170 閱讀 4652

lis lcs 對映

題目描述

給出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≤100000

無法相信這是模板題qaq

看此題的資料範圍,顯然使用最長公共子串行的一般dp演算法(時間複雜度為o(n^2))肯定會超時,所以我們需要想別的方法。

考慮此題的另乙個條件,兩個序列都為1…n的乙個排列,考慮特殊情況:

如果其中乙個排列為(1,2,…,n),另乙個排列為(a1,a2,…,an),那麼對於兩者的任意公共子串行(a[b1],a[b2],…,a[bk]),必有a[b1] < a[b2] < …< a[bk],則兩序列的最長公共子串行為排列(a1,a2,…,an)的最長上公升子串行。

那麼,對於兩個一般的排列(a1,a2,…,an)和(b1,b2,…,bn)的最長公共子串行怎麼求?

我們定義對映f(ai)=i,那麼兩個排列可以轉換為(f(a1),f(a2),…,f(an))=(1,2,…,n)和(f(b1),f(b2),…,f(bn)),我們進行這樣的轉換之後,就把本題轉換為求最長上公升子串行的長度的題目了。

之後便可以用lis的nlogn演算法計算了。

總的時間複雜度為處理對映o(n),求lis長度為o(n log n),總的時間複雜度為o(n log n)

code:

#include

int n,top;

int a[100005],dp[100005],f[100005];

int search(int x)

return l;

}int main()

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

printf("%d",top);

return

0;}

洛谷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 對於1...

P1439 模板 最長公共子串行(洛谷)

傳送門 這道題lcs。o n 2 暴力不僅會tle還會re。暴力的話就是dp的那個式子。這裡給出對數時間處理的 我們記錄陣列a的每個元素所在的下標,即把下標和對應的元素內容進行調換,得到pos。然後我們把pos陣列和b陣列進行操作,查詢b i 在pos中對應的位置 即在a中對應的位置 求出pos陣列...

洛谷 P1439 最長公共子串行

傳送門 給出1 n的兩個排列p1和p2,求它們的最長公共子串行。輸入格式 第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。輸出格式 乙個數,即最長公共子串行的長度 輸入樣例 5 3 2 1 4 5 1 2 3 4 5 輸出樣例 3 資料規模 對於50 的資料,n 1000 對於...