码迷,mamicode.com
首页 > 编程语言 > 详细

C++最长上升子序列(长度+序列)

时间:2020-05-03 09:11:44      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:img   一个   info   i++   需要   names   space   出现   --   

题目:
技术图片
类似题目很多,换汤不换药
分析:
对于一组数据来说,每个元素都可能是上升子序列的尾元素,只需要知道该元素前面上升子序列长度+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 <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        vector<int> v(n);
        for(int i=0;i<n;i++)
            cin>>v[i];
        vector<int> temp(n,1);
        int maxNum=1;
        for(int i=1;i<n;i++)//以v[i]为结尾元素时
        {
            for(int j=0;j<i;j++)
            {
                if(v[j]<v[i])
                    temp[i]=max(temp[i],temp[j]+1);
            }
            maxNum=max(temp[i],maxNum);//判断哪个结尾元素所出现的升序子序列最长
        }
        cout<<maxNum<<endl;
    }
    return 0;
}

最长上升子序列--序列

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

        for (int i = 1; i<n; i++)//以v[i]为结尾元素时
        {
            for (int j = 0; j<i; j++)
            {
                if (v[j]<v[i])
                    temp[i] = max(temp[i], temp[j] + 1);
            }

        }
        int maxNum = 0;
        int index;//最长子序列尾元素对应的下标值
        for (int i = 0; i < temp.size(); i++)
        {
            if (temp[i]>maxNum)//判断哪个结尾元素所出现的升序子序列最长
            {
                maxNum = temp[i];
                index = i;
            }
        }
        cout << maxNum << endl;//序列长度
        vector<int> 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;
}

C++最长上升子序列(长度+序列)

标签:img   一个   info   i++   需要   names   space   出现   --   

原文地址:https://blog.51cto.com/14233078/2492122

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!