動態規劃,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 為,那麼最長遞增子串行為。以...