這個一看就是n*n的暴力嘛,但是n有點大…
因為是兩個排列,換句話說沒有重複的數字;
那我們可以轉化一下
比如樣例
5我們把下面一行的值變成上面一行的位置3 2 1 4 5
1 2 3 4 5
3 2 1 4 5那麼直接最長上公升子串行就好了
為什麼呢?
比如第二行第乙個數1
如果我們選了1,那麼後面是不是只可以選擇在第一行1後面的數了;
就是這個道理;
然後對於最長上公升子串行我們有乙個基於單調棧和二分的演算法n*logn
就是維護乙個遞增的棧;
當前我們的值是x;
如果x>棧頂,那麼直接加入;
不然我們就二分找到第乙個大於x的數,直接替換;
因為x之後的數,全可以接在x的後面,所以直接替換就可以了;
最後答案就是棧的高度;
但是方案並不是棧的元素;
不好意思,這種方法不可以記錄方案的;
#include
#define ll long long
using
namespace
std;
const
int n=1e5+5;
int f[n],a[n],v[n],top;
int n,m,x,ans;
int er(int x)
return ans;
}int main()
printf("%d",top);
}
洛谷 P1439 排列LCS問題
題目描述 給出1 n的兩個排列p1和p2,求它們的最長公共子串行。輸入輸出格式 輸入格式 第一行是乙個數n,接下來兩行,每行為n個數,為自然數1 n的乙個排列。輸出格式 乙個數,即最長公共子串行的長度 輸入輸出樣例 輸入樣例 1 5 3 2 1 4 5 1 2 3 4 5 輸出樣例 1 說明 資料規...
洛谷P1439 最長公共子串行(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 100...
最長公共子串行問題(LCS) 洛谷 P1439
題目 p1439 模板 最長公共子串行 洛谷 電腦科學教育新生態 luogu.com.cn 關於lcs問題,可以通過離散化轉換為lis問題,於是就可以使用stl二分的方法o nlogn 解決lcs問題!先將a陣列與乙個遞增的數列1,2,3.n兩兩對應 t陣列 再把b陣列中每個數在a陣列中的位置表示成...