動態規劃_最大非降子序列的長度

最長非降子序列問題:longest increasing subsequence

給定一整型數列{a1,a2...,an}(n>0),求最大的非降子序列的長度。

如:1 9 10 5 11 2 13的最長非降子序列是1 9 10 11 13,長度爲5。

狀態轉移方程 dp【i】=max(dp【j】+1) ( j < i 且a [ i ] > =a[ j ])

用大白話解釋就是: 想要求dp[i],就把i前面的各個子序列中,最後一個數不大於a[i]的序列長度+1,然後取出最大的長度即爲dp[i];

求出各個子序列長度dp[i]後,最終的結果就是dp數組中最大的值.

#include<iostream>
#include<vector>

int lis(std::vector<int>& vec)
{
    //res保存所有的狀態,
    //res[i]表示以vec[i]爲結尾的子序列長度
    //初始化爲1
    std::vector<int> res(vec.size(),1);

    //length保存最大的長度
    int length=0;

    for(int i=0; i< vec.size(); ++i)
    {
        for(int j=0; j<i; ++j)
        {
            if(vec[i] >= vec[j])
                //狀態轉移方程
                res[i]= std::max(res[j]+1,res[i]);
        }

        if(res[i] > length)
            length = res[i];
    }

    //打印所有的狀態
    for(int n=0 ; n< res.size() ; ++n)
        std::cout <<n <<" : " << res[n] << std::endl;

    //返回最大長度
    return length;
}

int main()
{
    int arr[]={5,3,3,4,8,6,7,9,4,2};
    std::vector<int> vec( arr , arr+sizeof(arr)/sizeof(int) );
    std::cout << "lis's length is :" << lis(vec) << std::endl;
    return 0;
}



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