Pagini recente » Cod sursa (job #1758758) | Cod sursa (job #948101) | Cod sursa (job #2249335) | Cod sursa (job #220934) | Cod sursa (job #955388)
Cod sursa(job #955388)
#include<fstream>
using namespace std;
int n, *a, *pre, *m;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void subsir_max(int t)
{
// va returna lungimea maxima a unui subsir care are cel mai mare element < t
int i, maxim = 0, imax = -1;
// cautam subsirul care are dim. maxima (m[i] > maxim) dar cu cel mai mare element mai mic decat elementul curent (a[t] > a[i])
for(i = 0; i < t; i++)
{
if(a[t] > a[i] && m[i] > maxim)
{
maxim = m[i];
imax = i;
pre[t] = i;
m[t] = maxim + 1;
}
}
if(imax == -1)
{
m[t] = 1;
pre[t] = -1;
}
}
void afis_sol(int i)
{
if(pre[i] != -1)
{
afis_sol(pre[i]);
fout << a[i] << " ";
}
else
fout << a[i] << " ";
}
int main()
{
int i, max, imax;
fin >> n;
a = new int[n];
pre = new int[n];
m = new int[n];
for(i = 0; i < n; i++)
fin >> a[i];
pre[0] = -1;
m[0] = 1;
for(i = 1; i < n; i++)
{
subsir_max(i);
}
max = 0;
imax = 0;
for(i = 0; i < n; i++) // cautam elementul la care se opreste cel mai mare subsir crescator
{
if(m[i] > max)
{
max = m[i];
imax = i;
}
}
fout << max << endl;
afis_sol(imax);
return 0;
}