Pagini recente » Cod sursa (job #1506527) | Cod sursa (job #723068) | Cod sursa (job #1528857) | Cod sursa (job #1076590) | Cod sursa (job #239766)
Cod sursa(job #239766)
#include<fstream>
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
void DP(long v[], long n)
{
long lungime,inceput,i,j;
long *maxime=new long[n];
long *urmatorul=new long[n];
long *subsir=new long[n];
maxime[n-1] = 1;
urmatorul[n-1] =-1;
for(i=n-2;i>=0;i--)
{
maxime[i] = 1;
urmatorul[i] =-1;
for(j=n-1;j>i;j--)
if((v[i]<v[j])&&(maxime[i]<=maxime[j])) maxime[i]=maxime[j]+1,urmatorul[i]=j;
}
lungime = maxime[0];
inceput = 0;
for(i=1;i<n;i++)
if(lungime<maxime[i]) lungime=maxime[i],inceput=i;
subsir[0] = v[inceput];
g<<lungime<<"\n";
g<<subsir[0]<<" ";
for(i=1;i<lungime;i++) inceput=urmatorul[inceput],subsir[i]=v[inceput],g<<subsir[i]<<" ";
}
int main()
{
long n,x;
f>>n;
long *v=new long[n];
for(int i=0;i<n;i++) f>>v[i];
DP(v,n);
f.close();
g.close();
return 0;
}