排列LCS問題

2021-07-24 17:00:34 字數 1454 閱讀 5426

題目描述

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

簡要分析:將原問題通過排列中各元素的對應關係,轉化為求序列中最長不降子串行問題 二分查詢維護d陣列 期望複雜度o(nlogn).

program lcs;

var n,i,j,l,r,mid,cnt,p,tem:longint;

b,d,c:array[0..100000] of longint;

function

search

(x,y,k:longint):longint;

var l,r,mid:longint;

begin

l:=x; r:=y;

while l<>r do

begin

mid:=(l+r) shr

1; if d[mid]>k then r:=mid

else

if d[mid]then l:=mid+1;

end;

exit(r);

end;

begin

readln(n);

for i:=1

to n do

begin

read(tem);

c[tem]:=i; //c陣列為下標陣列

end;

for i:=1

to n do

begin

read(tem);

b[i]:=c[tem];

end;

cnt:=1;

fillchar(d,sizeof(d),0);

d[1]:=b[1];

for i:=2

to n do

begin

if b[i]>d[cnt] then

begin

inc(cnt);

d[cnt]:=b[i]

endelse

if b[i]1] then d[1]:=b[i]

else

begin

p:=search(1,cnt,b[i]);

d[p]:=b[i];

end;

end;

writeln(cnt);

end.

洛谷 P1439 排列LCS問題

題目描述 給出1 n的兩個排列p1和p2,求它們的最長公共子串行。輸入輸出格式 輸入格式 第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。輸出格式 乙個數,即最長公共子串行的長度 輸入輸出樣例 輸入樣例 1 5 3 2 1 4 5 1 2 3 4 5 輸出樣例 1 說明 資料規...

xjb 洛谷 P1439 排列LCS問題

這個一看就是n n的暴力嘛,但是n有點大 因為是兩個排列,換句話說沒有重複的數字 那我們可以轉化一下 比如樣例 5 3 2 1 4 5 1 2 3 4 5 我們把下面一行的值變成上面一行的位置 3 2 1 4 5 那麼直接最長上公升子串行就好了 為什麼呢?比如第二行第乙個數1 如果我們選了1,那麼後...

LCS問題 動態規劃

簡述 lcs問題,即最長公共子串行問題,給定兩個序列x 和y 求x y最長的公共子串行。與lis類似,lcs也是可以不連續的。解題思路 本人覺得在這個問題上演算法導論講的很好,所以在此我主要是整理。1 首先我們來考慮暴力搜尋求解的方法,我們要暴力列舉x的所有子串行,然後再看看是不是也是y的子串行,這...