假設有序列: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]對應的最長子序列長度是 } } }
二、出操隊形