fbpx

Problema #396 – SCLM – Rezolvari PBInfo

de Mihai-Alexandru

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

S-ar putea sa iti placa