Pagini recente » Cod sursa (job #3205924) | Cod sursa (job #2865491) | Cod sursa (job #1743200) | Cod sursa (job #1139400) | Cod sursa (job #1826441)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int lmax[100005],urm[100005],maxi,n,i,j,pmax,a[100005];
///a-vectorul initial
///lmax[i]-este lungimea sirului maximal ce se poate forma pornind de la elem i
///urm[i]-este pozitia urmatorului elem dupa a[i] care apare in sirul de lungime maximala
int main()
{ f>>n;
for(i=1;i<=n;i++)
f>>a[i];
lmax[n]=1;
urm[n]=-1;
for(i=n-1;i>=1;i--)
{maxi=0;pmax=-1;
for(j=i+1;j<=n;j++)///daca nu pun egal obtin prima solutie, daca pun egal o obtin pe ultima, ambele fiind optime
{int x;x=lmax[j];
if(a[i]<a[j]&&x>=maxi){maxi=x;pmax=j;}
///Daca punem >= obtinem cel mai lung subsir descrescator de lungime maxima
lmax[i]=1+maxi;urm[i]=pmax;}
}
pmax=1;
maxi=lmax[1];
for(i=2;i<=n;i++)
{int x;x=lmax[i];if(x>maxi){maxi=x;pmax=i;}}
g<<maxi<<'\n';
for(i=pmax;i!=-1;i=urm[i])
g<<a[i]<<" ";
}