Pagini recente » Cod sursa (job #690537) | Cod sursa (job #1120668) | Cod sursa (job #2838837) | Cod sursa (job #2861695) | Cod sursa (job #239768)
Cod sursa(job #239768)
#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<<v[inceput]<<" ";
for(i=1;i<lungime;i++) {inceput=urmatorul[inceput];subsir[i]=v[inceput];g<<subsir[i]<<" ";}
}
int main()
{
long n,x,i;
f>>n;
long *v=new long[n];
for(i=0;i<n;i++) f>>v[i];
DP(v,n);
f.close();
g.close();
return 0;
}