Pagini recente » Cod sursa (job #2516291) | Cod sursa (job #1026012) | Cod sursa (job #271865) | Cod sursa (job #650137) | Cod sursa (job #1836983)
#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();
}