動態規劃-最長上升子序列問題(LIS)
阿新 • • 發佈:2018-11-09
給定n個整數A1,A2,...An,按從左到右的順序選出儘量多的整數,組成一個上升子序列(子序列可以理為:刪除0個或多個數,其他數的順序不變)。例如序列1,6,2,3,7,5,可以選出上升子序列1,2,3,5,也可以選出1,6,7,但前者更長。選出的上升子序列中相鄰元素不能相等。
輸入:整數的數目n,各個整數A1,A2,...An
輸出:最長上升子序列長度。
執行結果:
設d(i)為以i結尾的最長上升子序列的長度。則d(i)=max{0, d(j)| j < i, Aj < Ai} + 1,最終答案是 max {d(i)}。如果LIS中的相鄰元素可以相等,把小於號改成小於等於號即可。
void solve(int *a,int n) { /*d(i)為以i結尾的最長上升子序列的長度 d(i)=max{0,d(j)|j<i,Aj<Ai}+1 答案為 max{d(i)} */ int i,j,d[10]; for(i=0;i<n;i++) { d[i]=0; for(j=0;j<i;j++) if(a[i]>a[j]) d[i]=max(d[i],d[j]); d[i]++; } int maxd = d[0]; for(i=1;i<n;i++) maxd = max(maxd, d[i]); printf("%d\n",maxd); }