假設有序列:2,1,3,5,求一個最長上升子序列就是2,3,5或者1,3,5,長度都為3。
LIS算法的思想是:
設存在序列a。
① 如果只有一個元素,那麼最長上升子序列的長度為1;
② 如果有兩個元素,那麼如果a[1]>a[0],則最長上升子序列的長度為2,a[1]為該最長上升子序列的最後一個元素;若a[1]<a[0],則最長上升子序列的長度為1,a[0]和a[1]均為 其最長上升子序列的最後一個元素。
③ 如果由三個元素,那麼如果a[2]>a[0],a[2]>a[1],則a[2]可以作為a[0]或者a[1]所在最長上升子序列的最後一個元素。那選擇哪一個序列就要看a[0],a[1]哪個所在的序列要更長。
④ 擴展到n個元素,就是看以a[n]為最後一個元素的最長上升子序列的長度是多少。
定義兩個數組,一個是a,一個是b。
a存放原始數據,b[i]存放的是以a[i]結尾的最長上升子序列的長度。
代碼如下:
class Lmax{
public static void Lmax(int[] a,int[] b){
b[0]=1;
for(int i=1;i<a.length;i++){
int countmax=0;
for(int j=0;j<i;j++){
if(a[i]>a[j]&&b[j]>countmax){
countmax=b[j]; //記錄下元素數值比a[i]小的但是對應子序列最長的子序列長度
}
}
b[i]=countmax+1; //a[i]對應的最長子序列長度是
}
}
}
二、出操隊形