Pagini recente » Cod sursa (job #310586) | Cod sursa (job #1268826) | Cod sursa (job #623696) | Cod sursa (job #1969762) | Cod sursa (job #1516695)
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int a[100003], lis[100003], sir[100003], n, maxi, maxim;
void Citire()
{
fin >> n;
for (int i=1; i<=n; i++)
fin >> a[i];
}
void LIS()
{
int i,j;
/// lis[i] = 1 + max {lis[j] / j<i cu proprietatea ca a[j] < a[i] }
lis[1] = 1;
for (i=2; i<=n; i++)
{
maxi = 0;
for (j=1; j<i; j++)
{
if (a[j] < a[i] && lis[j] > maxi)
maxi = lis[j];
}
if (maxi == 0) lis[i] = 1;
else lis[i] = maxi + 1;
}
for (i=1; i<=n; i++)
cout << lis[i] << " ";
}
void Afisare()
{
int i, poz, m;
/// mai intai sa gasim maximul
maxi = 0;
for (i=1; i<=n; i++)
{
if (lis[i] > maxi)
{
maxi = lis[i];
poz = i;
}
}
/// am reperat unde se termina longest increasing "sir"
fout << maxi << "\n"; /// am afisat lungimea, acum sa reconst. sirul
/// ma duc spre stanga
m = maxi - 1;
maxim = maxi;
i = poz;
sir[maxi] = a[i];
while (i>=1 && m>=1)
{
/// sunt la poz si ma duc spre stanga pana gasesc un a[j] < a[i] cu lis[j] = m;
while (!(a[i] < a[poz] && lis[i] == m))
{
i--;
}
sir[--maxi] = a[i];
poz = i;
m = m -1;
}
}
void Printing()
{
for (int i=1; i<=maxim; i++)
fout << sir[i] << " ";
fout << "\n";
}
int main ()
{
Citire();
LIS();
Afisare();
Printing();
fin.close();
fout.close();
return 0;
}