Cod sursa(job #1836983)

Utilizator medicinedoctoralexandru medicinedoctor Data 28 decembrie 2016 22:04:44
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

vector <int> a,s;
vector <bool> b;

void read()
{
    int n;
    cin >> n;
    a.resize(n);
    b.resize(n);
    fill(b.begin(),b.end(),true);
    for (int i=0; i<a.size(); i++)
        cin >> a[i];
}

void write()
{
    cout << s.size() << '\n';
    for (int i=s.size()-1; i>=0; i--)
        cout << s[i] << ' ';
}

void magic(vector <vector <int> > &x)
{
    vector <int> y(a.size());
    fill(y.begin(),y.end(),0);
    for (int i=0; i<a.size(); i++)
        x.push_back(y);
}

void add(int x)
{
    if (b[x])
    {
        s.push_back(a[x]);
        b[x]=false;
    }
}

void solve()
{
    vector <vector <int> > x;
    magic(x);
    for (int i=1; i<x.size(); i++)
        for (int j=i+1; j<x.size(); j++)
            if (a[j]>a[i]) x[i][j]=1+x[i-1][j-1];
            else x[i][j]=max(x[i-1][j],x[i][j-1]);

    for (int i=a.size()-1,j=a.size()-1; i>=0 && j>=0;)
        if (a[j]>a[i]) add(j),add(i),i--,j--;
        else
            if (i==0) j--; else if (j==0) i--; else if (x[i-1][j]<x[i][j-1]) --j; else --i;
}

main()
{
    read();
    solve();
    write();
}