給出1-n的兩個排列p1和p2,求它們的最長公共子串行。
輸入格式:
第一行是乙個數n,
接下來兩行,每行為n個數,為自然數1-n的乙個排列。
輸出格式:
乙個數,即最長公共子串行的長度
輸入樣例#1:複製
5輸出樣例#1:複製3 2 1 4 5
1 2 3 4 5
3【資料規模】
對於50%的資料,n≤1000
對於100%的資料,n≤100000
思路:經典的dp方法肯定解決不了這問題,那麼我們首先看樣例3 2 1 4 5 我們把他變成 1 2 3 4 5 用乙個belong陣列記錄一下每個數字變成了什麼,相當於離散化了一下3-1;2-2;1-3;4-4;5-5;
現在我們的第二串1 2 3 4 5 按我們離散化的表示:3 2 1 4 5
可能有些人已經懂了,我們把第乙個串離散化後的陣列是滿足上公升,反過來,滿足上公升的也就是滿足原串的排列順序的,那麼結果就變成了乙個求最長不下降子串行,直接使用o(nlgn)做法
#include#include#includeusing namespace std;
const int inf = 1e9 + 7;
int n, num;
const int maxn = 100000;
int belong[maxn], a[maxn], b[maxn], c[maxn], g[maxn];
int main()
for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
for (int i = 1; i <= n; i++) c[i] = belong[b[i]];//用c記錄離散化後的數
fill(g, g + maxn, inf);//求解最長不下降子串行
for (int i = 1; i <= n; i++)
for (int i = 1; i <= n; i++)
cout << num << endl;//結束
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 對於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...