最長上升子序列

轉載請註明原文地址:http://www.cnblogs.com/GodA/p/5180560.html

  學習動態規劃問題(DP問題)中,其中有一個知識點叫最長上升子序列(longest  increasing subsequence),也可以叫最長非降序子序列,簡稱LIS。簡單說一下自己的心得。

  我們都知道,動態規劃的一個特點就是當前解可以由上一個階段的解推出, 由此,把我們要求的問題簡化成一個更小的子問題。子問題具有相同的求解方式,只不過是規模小了而已。最長上升子序列就符合這一特性。我們要求n個數的最長上升子序列,可以求前n-1個數的最長上升子序列,再跟第n個數進行判斷。求前n-1個數的最長上升子序列,可以通過求前n-2個數的最長上升子序列……直到求前1個數的最長上升子序列,此時LIS當然爲1。

  讓我們舉個例子:求 2 7 1 5 6 4 3 8 9 的最長上升子序列。我們定義d(i) (i∈[1,n])來表示前i個數以A[i]結尾的最長上升子序列長度。

  前1個數 d(1)=1 子序列爲2;

  前2個數 7前面有2小於7 d(2)=d(1)+1=2 子序列爲2 7

  前3個數 在1前面沒有比1更小的,1自身組成長度爲1的子序列 d(3)=1 子序列爲1

  前4個數 5前面有2小於5 d(4)=d(1)+1=2 子序列爲2 5

  前5個數 6前面有2 5小於6 d(5)=d(4)+1=3 子序列爲2 5 6

  前6個數 4前面有2小於4 d(6)=d(1)+1=2 子序列爲2 4

  前7個數 3前面有2小於3 d(3)=d(1)+1=2 子序列爲2 3

  前8個數 8前面有2 5 6小於8 d(8)=d(5)+1=4 子序列爲2 5 6 8

  前9個數 9前面有2 5 6 8小於9 d(9)=d(8)+1=5 子序列爲2 5 6 8 9

  d(i)=max{d(1),d(2),……,d(i)} 我們可以看出這9個數的LIS爲d(9)=5

  總結一下,d(i)就是找以A[i]結尾的,在A[i]之前的最長上升子序列+1,當A[i]之前沒有比A[i]更小的數時,d(i)=1。所有的d(i)裏面最大的那個就是最長上升子序列。

int LIS(int A[],int n)
{
    int[] d = new int[n];
    int len = 1;
    int i,j;
    for(i=0;i<n;i++)
    {
        d[i]=1;
        for(j=0;j<i;j++)
        {
            if(A[j]<=A[i] && (d[j]+1)>=d[i])
                d[i]=d[j]+1;
        }
        if(d[i]>len) len=d[i];
    }
    delete []d;
    return len;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章