題目描述
給出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的子串行,這...