LIS 求最長遞增子串行

2021-08-11 12:28:34 字數 925 閱讀 4311

動態規劃,dp;

時間複雜度:olog(n^2);

#include

#include

#include

#include

#include

using

namespace

std;

int lis(int a,int alen,int len)

}if(alen[i]>maxlen)

}return maxlen;

}int main()

int len=lis(a,alen,n);

printf("%d\n",len);

}}

二分查詢+dp

替換思想,在我所現在有的遞增子串行arr[len]裡找第乙個大於a[i]的,用a[i]替換它;

時間複雜度olog(n);

#include

#include

#include

#include

#include

using

namespace

std;

#define n 40005

int a[n];

int arr[n];

int under_pos(int *dp,int l,int r,int key)

else

}return l;

}int main()

arr[1]=a[0];

int len=1;

for(int i=1; iif(a[i]>arr[len])

else

}printf("%d\n",len);

}}

可以利用最長公共子串行lcs

現將給定的序列排序,然後,跟原序列求最長公共子串行;

最長遞增子串行 LIS

對於這個問題,最直觀的dp方法是cnt i 表示以height i 結束的最長遞增子串行的元素的個數,遞迴方程是cnt i max for max i 0 i求出整個數列的最長遞增子串行的長度 if b i max max b i cout return 0 顯然,這種方法的時間複雜度仍為o n 2...

最長遞增子串行 LIS

給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.這個問題可以轉換為最長公共子串行問題。如例子中的陣列a,則我們排序該陣列得到陣列a 然後找出陣列a和a 的最長公共子串行即可。顯然這裡最長公共子串行...

最長遞增子串行(LIS)

300.longest increasing subsequence good 給定乙個長度為n的陣列,找出乙個最長的單調遞增子串行 不一定連續,當時先後順序不能亂 更正式的定義是 設l 是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin 其中k1。比如陣列a 為,那麼最長遞增子串行為。以...