Cod sursa(job #2529031)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 22 ianuarie 2020 21:17:13
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

//varianta O(n^2)
int a[100001], dp[100001], p[100001];
int s[100001];
//dp[i] = lungimea celui mai lung subsir strict crescator care se termina in i
//p[i] = -1, daca i este primul termen al sirului
//       j, (j<i) pentru care obtin maximul

int main()
{
    int i, j, n, imax;
    fin >> n;
    for (i = 1; i<=n; i++)
        fin >> a[i];
    dp[1] = 1;
    p[1] = -1;
    for (i = 2; i<=n; i++)
    {
        dp[i] = 1;
        p[i] = -1;
        for (j = i-1; j>=1; j--)
            if (a[i] > a[j] && dp[j]+1 > dp[i])
            {
                dp[i] = dp[j]+1;
                p[i] = j;
            }
    }
    imax = 1;
    for (i = 2; i<=n; i++)
        if (dp[i] > dp[imax])
            imax = i;
    fout << dp[imax] << '\n';
    for (i = imax, j = 1; i!=-1; i=p[i], j++)
        s[j] = i;
    for (i = dp[imax]; i>=1; i--)
        fout << a[s[i]] << ' ';
    return 0;
}