码迷,mamicode.com
首页 > 其他好文 > 详细

最长上升子序列

时间:2018-01-08 16:36:59      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:str   序列   利用   空格   include   测试用例   一个   测试   cin   

Description

求最长上升子序列。

Input

单测试用例。

第一行是一个正整数n,0 < n ≤ 3000

第二行是n个非负整数。

Output

两行结果。

第一行是最长上升子序列的长度。

第二行是任意一个最长上升子序列,每个整数后面跟一个空格。

Sample Input

8
5 2 8 6 3 6 9 7

Sample Output

4
2 3 6 7

代码演示

#include<iostream>
using namespace std;
int main(){
    int n;int a[3002],b[3002]={0}, c[3002];
    cin >> n;
    b[1]=1;
    for(int i=1;i<=n;i++){
        cin >> a[i];
    }
    int max =0;
    for(int i=2;i<=n;i++){
        int k=0;
        for(int j=1;j<i;j++){
            if(a[j]<a[i]&&k<b[j]) //a[j]不能等于a[i],防止在连续相等的情况下,如 2 2
                k=b[j];
            b[i]=k+1;
            if(max<b[i]){
                max = b[i];
            }
        }
    }
    cout << max <<endl;
    //以上代码已经计算出最长上升子序列的长度
    //下面利用上面得到的b[i]计算出最长上升子序列
    int count = 1;
    c[1]=a[1];
    for(int i=1;i<n;i++)
        if(b[i]==b[i+1])
            c[count] = a[i+1];
        else if(b[i]<b[i+1]){
            c[++count] = a[i+1];
        }
        else b[i+1]=b[i];
    for(int i=1;i<=count;i++){
        cout << c[i] << " ";
    }
    return 0;
}

 

 

最长上升子序列

标签:str   序列   利用   空格   include   测试用例   一个   测试   cin   

原文地址:https://www.cnblogs.com/dichuan/p/7788862.html

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