Pagini recente » Cod sursa (job #1092285) | Cod sursa (job #2168759) | Cod sursa (job #1813617) | Cod sursa (job #2777672) | Cod sursa (job #1893900)
#include <fstream>
#include <algorithm>
using namespace std;
#define valMax 100005
int n, s[valMax], // sirul initial nemodif
l[valMax], // lungimea maxima subsir cu elemente pana la poz curenta
ea[valMax], // index element anterior elementului curent in subsir
ss[valMax]; // subsirul de lunfime maxima
ifstream in("scmax.in");
ofstream out("scmax.out");
int main()
{
// cirie
in>>n;
for (int i = 1; i <= n; i++){
in>>s[i];
}
// cautare subsir de lungime maxima
for (int i = 1; i <= n; i++){
int jMax=0;
for (int j = 1; j < i; j++){
if(l[j]>l[jMax] && s[i]>s[j]){
jMax=j;
}
}
l[i]=l[jMax]+1;
ea[i]=jMax;
}
// alegere subsir de lungime maxima din cele maxime ale fiecarui nivel
// deoarece in D[] avem subsirul de lungime maxima care se termina cu poz curenta
// si pot exista cazuri in care pe ultima pozitie sa avem un subsir mai scurt
// ex: 1 3 5 8 2
int iMax=0;
for (int i = 1; i <= n; i++)
if (l[iMax] < l[i])
iMax = i;
//afisare
out<<l[iMax]<<'\n';
for (int j=l[iMax],i = iMax; i>0;i=ea[i])
ss[j--]=s[i];
for (int i = 1; i<=l[iMax]; i++)
out<<ss[i]<<' ';
out<<'\n';
return 0;
}