將陣列反轉後,求up[i]表示包括i的最長不降序列,down[i]表示最長不上公升序列,取最優。
nlogn的演算法:若要求最長上公升序列,p[i]表示長度為i的序列的末尾最小值(貪心,最小值更有潛力獲得更長的串),很明顯p是單調增的,當加入乙個新元素時,二分p中最靠右的小於它的值j,更新p[j+1],同時記錄up[i]。最長下降同理,p[i]表示長度為i的序列的末尾最大值(貪心,最大值更有潛力獲得更長的串),很明顯p是單調減的。
因為是由貪心得來的,same[i]表示不上公升和不下降序列開始的公共部分。
#include#include#include#include#include#include#include#include#include#include#define inf 1000000000
#define pi acos(-1.0)
#define eps 1e-8
#define seed 131
using namespace std;
typedef pairpii;
typedef unsigned long long ull;
typedef long long ll;
const int maxn=100005;
int n;
int d[maxn];
int up[maxn];
int down[maxn];
int p[maxn];
int same[maxn];
int main()
int len=0;
p[0]=0;
for(int i=1;i<=n;i++)
else
}len=0;
p[0]=inf;
for(int i=1;i<=n;i++)
while(l2=d[i])
l2=mid;
else
r2=mid-1;
}same[i]=min(same[i],l2-l1+1);
if(d[i]<=p[len])
else{
int l=0,r=len,mid;
while(l
Dp 最長上公升子串 最長上公升子串行
乙個數的子串bi,當b1 b2 bs的時候,我們稱這個子串是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串 ai1,ai2,aik 這裡1 i1 i2 ik n。如 對於序列 1,7,3,5,9,4,8 有它的一些上公升子串,如 1,7 3,5,9 等等。這些子串中最長...
最長上公升 不下降子串行
最長上公升 不下降子串行 lis 有兩種方法 1.動態規劃,o n 2 容易得出o n 2 的dp遞推公式 d i max 1 1 j d i 為以元素i結尾的最長子序列個數。這樣經過兩重迴圈一次遍歷可以得到最長上公升子串行。view code 1 include 2 include 3 inclu...
nlogn求最長上公升子串行或最長下降子串行
思路很簡單,維護乙個長度為k時的最長上公升子串行結尾元素是d k 的陣列,因為前面的元素已經插入了,後面的元素對前面的只有更優的影響,所以只掃一遍原陣列就能求得。推薦看這篇部落格 講得很詳細 include using namespace std const int n 1e5 7 int a n ...