题目:
C++最长上升子序列(长度+序列)
类似题目很多,换汤不换药
分析:
对于一组数据来说,每个元素都可能是上升子序列的尾元素,只需要知道该元素前面上升子序列长度+1就ok了
以(1,7,3,5,9,4,8)来说:
f[0]=1,f[1]=2,f[2]=2,f[3]=3,f[4]=4,f[5]=3,f[6]=4;
最长上升子序列长度

#include 
#include 
#include 
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        vector v(n);
        for(int i=0;i>v[i];
        vector temp(n,1);
        int maxNum=1;
        for(int i=1;i

最长上升子序列--序列

#include 
#include 
#include 
using namespace std;
int main()
{
    int n;
    while (cin >> n)
    {
        vector v(n);
        for (int i = 0; i> v[i];
        vector temp(n, 1);

        for (int i = 1; imaxNum)//判断哪个结尾元素所出现的升序子序列最长
            {
                maxNum = temp[i];
                index = i;
            }
        }
        cout << maxNum << endl;//序列长度
        vector data(maxNum+1,0);//保存序列元素
        for (int i = 1; i <= maxNum; i++)
        {
           // j<=index防止data[i]中元素越过尾元素下标
             //防止1,2,5,6,3,4这样的序列出错
            for (int j = i-1; j <= index; j++)
            {
                if (i == temp[j])
                    data[i] = v[j];// temp数组中相同的元素,最后一个,肯定是最长上升子序列中的元素
            }
        }
        for (int i = 1; i <= maxNum; i++)
            cout << data[i] << " ";
        cout << endl;
    }
    return 0;
}