Pagini recente » Cod sursa (job #285274) | Cod sursa (job #1074885) | Cod sursa (job #167174) | Cod sursa (job #1897665) | Cod sursa (job #1411362)
//subsir crescator maximal
// O(N^2)
/* l[i] = lungimea celui mai SCMAX format DOAR cu primele i
elemente si care se TERMINA SIGUR cu v[i];
voi gasi o pozitie j < i unde an un subsir .... , v[j]
daca v[j] < v[i] pot sa fac ....,v[j],v[i] => l[i]=max(l[i], l[j]+1);
ante[i] = este acea pozitie j din sirul de mai sus */
#include <fstream>
#define NMAX 100099
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,nr,v[NMAX];
int l[NMAX],maxx,poz,ante[NMAX],fin[NMAX];
int main()
{
f>>n;
for (int i=1; i<=n; ++i)
{
f>>v[i];
l[i]=1;
}
l[1]=1; //
for(int i=2; i<=n; ++i)
for (int j=1; j<=i-1; ++j)
if (v[j]<v[i])
{
if (l[i]<l[j]+1)
{
l[i]=l[j]+1;
ante[i]=j;
}
}
maxx=1;
for (int i=1; i<=n; ++i)
if (l[i]>maxx)
{
maxx=l[i];
poz=i;
}
nr=0;
while (poz!=0)
{
++nr;
fin[nr]=v[poz];
// sirul este ..., v[ante[poz]], v[poz], ...
// merg spre stanga
poz=ante[poz];
}
g<<maxx<<'\n';
for (int i=nr; i>=1; --i) g<<fin[i]<<' ';
g<<'\n';
g.close(); f.close();
return 0;
}