傳送門
這題怎麼能叫模板呢,分明是個變種題
解題思路:dp呀,這不是肯定dp嘛,dp[i][j]指的是a串到第i個字元,b串到第j個字元的最長公共子串行,看一眼資料,還要把二維優化成一維。**如下
#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=1e5+5;
int dp[maxn];
int a[maxn],b[maxn],n;
int main()
for(int i=1;i<=n;++i)
for(int i=1;i<=n;++i)
} cout<50分!t的飛起(n也太大了呀),那這題還能怎麼解啊,一時之間毫無頭緒。可能這題是在告訴我們不能固定思維吧;
正解:求最長上公升子串行,這又是如何聯絡上的呢,由於題意說是1-n的排列(也是一開始沒有注意到的),所以可以一一對映,我們只要把第乙個序列對映成1,2,3...n,那在第二個序列的對映裡求乙個最長上公升子串行就行了。就拿題目給的例子舉個栗子:
3 2 1 4 5 我們將這個序列對映成1~n;那就是 3->1, 2->2, 1->3, 4->4, 5->5
該序列就變成了 (1) (2) (3) (4) (5)
1 2 3 4 5 這個序列根據對映規則同樣,變成了(3) (2) (1) (4) (5)
由於對映規則相同,只需要在第二個序列中求最長上公升序列 (1) (4) (5) 對應得原數就是 3,4,5這一步轉化還是非常巧妙的。
這樣變成了求最長上公升子串行,複雜度為o(nlogn);
#includeusing namespace std;
const int maxn=1e5+5;
int n,be[maxn],la[maxn],tp,len=0;
int main()
for(int i=1;i<=n;++i)
else
} cout
}
Luogu P1439 模板 最長公共子串行
給出1 n的兩個排列p1和p2,求它們的最長公共子串行。輸入格式 第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。輸出格式 乙個數,即最長公共子串行的長度 資料規模 對於50 的資料,n 1000 對於100 的資料,n 100000 因為是給定的兩串數字是排列,所以可以利用一...
洛谷1439 模板 最長公共子串行
題目 最長公共子串行 思路 這題用一般的dp來做,f i j 表示a的前i位和b的前j位的最長公共子串行的長度,時間複雜度為o n 2 在這題會tle。在這題中,需要用o nlogn 的複雜度實現。先設計乙個陣列b,b i 代表b串中的數第i個數在a串中的位置。例如 a串 3 2 1 4 5 b串 ...
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...