392
Cerinţa
Se dă un șir cu n elemente, numere naturale. Determinați un cel mai lung subșir crescător al șirului.
Date de intrare
Fişierul de intrare sclm.in conţine pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spaţii, reprezentând elementele șirului.
Date de ieşire
Fişierul de ieşire sclm.out va conţine pe prima linie numărul L, reprezentând lungimea maximă a unui subșir crescător. A doua linie va conține L numere cu valori între 1 și n, ordonate crescător, reprezentând indicii elementelor din șirul dat care dau subșirul crescător de lungime maximă.
Restricţii şi precizări
1 ≤ n ≤ 1000- numerele de pe a doua linie a fişierului de intrare vor fi cel mult egali cu
1.000.000 - orice șir de indici care duce la subșir crescător de lungime maximă este corectă
Exemplu
sclm.in
10 5 10 7 4 5 8 9 8 10 2
sclm.out
5 1 3 6 7 9
Explicație
Elementele șirului care corespund acestor indici sunt: 5 7 8 9 10.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("sclm.in");
ofstream cout("sclm.out");
int n , a[1002] , L[1002] , P[1002] , p , l , pmax , lmax;
int main()
{
cin >> n;
for(int i = 1 ; i <= n ; i++)
cin >> a[i];
for(int i = n ; i >= 1 ; i--)
{
p = i;
l = 0;
for(int j = i + 1 ; j <= n ; j++)
if(a[i] <= a[j] && L[j] > l)
{
l = L[j];
p = j;
}
L[i] = l + 1;
P[i] = p;
if(L[i] > lmax)
{
lmax = L[i];
pmax = i;
}
}
/*for(int i = 1 ; i <= n ; i++)
cout << L[i] << " ";
cout << '\n';
for(int i = 1 ; i <= n ; i++)
cout << P[i] << " ";*/
cout << lmax << '\n';
p = pmax;
while(p != P[p])
{
cout << p << " ";
p = P[p];
}
cout << p;
return 0;
}
Comentarii