1. 程式人生 > >動態規劃-最長上升子序列問題(LIS)

動態規劃-最長上升子序列問題(LIS)

給定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);
}