求最长的上升子序列

来源:互联网 发布:java解压缩rar文件 编辑:程序博客网 时间:2024/06/05 15:13

题目:

一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)或(1, 3, 4, 8). 你的任务,就是对于给定的序列,求出最长上升子序列的长度。

#include <iostream>#include <vector>using namespace std;const int MaxNum = 10000;int main(){    int N;    int Num[MaxNum + 1];    int MaxLen[MaxNum + 1];    vector<int> ivec;    cin >> N;    for(int i = 0; i < N; ++i)    {        cin >> Num[i];    }    MaxLen[0] = 1;    for(int i = 1; i < N; ++i)    {        int nTmp = 0;        int TmpMax = 0;        for(int j = 0; j < i; ++j)        {            if(Num[i] > Num[j])//MaxLen[j]的值,就是在Num[i]左边,终点数小于b[i],            {                if(MaxLen[j] > nTmp) //且长度最长的那个上升子序列的                nTmp = MaxLen[j]; //长度加1比如:1,3,5,2,6,7,3            }        }        MaxLen[i] = nTmp + 1;//记录每个i对应的长度    }    int nTmpMax = 0;    //找出最长的上升序列的长度    int j = 0;//记录具有最长长度的位置    for(int i = 0; i < N; ++i)    {        if(MaxLen[i] > nTmpMax)        {            nTmpMax = MaxLen[i];            j = i;        }    }    cout << nTmpMax << endl;    //显示出最长序列    int x = nTmpMax - 1;    ivec.push_back(Num[j]);    for(int i = j - 1;0 <= i; --i)    {        if(Num[i] < Num[j])        {            if(MaxLen[i] != x)            {               continue;            }            --x;            ivec.push_back(Num[i]);        }    }    for(vector<int>::iterator iter = ivec.end() - 1; iter != ivec.begin() - 1; --iter)    {        cout << *iter << " ";    }    return 0;}


 

原创粉丝点击