Cod sursa(job #2496877)

Utilizator andreicadarCadar Andrei andreicadar Data 21 noiembrie 2019 19:46:09
Problema Subsir crescator maximal Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#include <bits/stdc++.h>

using namespace std;

#define newline '\n'

ifstream f("scmax.in");
ofstream g("scmax.out");

int numere[100001],numar_de_numere,dp[100001];

void Write(int number_of_numbers, int numbers[]);

void Read()
{
    f>>numar_de_numere;
    for(int i = 1; i <= numar_de_numere; i++)
        f>>numere[i];
}

void Solve_One_Iteration()
{
    int i, j, maxim_f_dp, solution[100001], poz_in_solution;

    maxim_f_dp = 0;
    poz_in_solution = 1;
    dp[numar_de_numere] = 1;

    for(i = numar_de_numere-1; i >= 1; i--)
    {
        dp[i] = 1;
        for(j = i+1; j <= numar_de_numere; j++)
            if(numere[i] < numere[j])
                {
                    if(dp[i] < dp[j]+1)
                        {
                            dp[i] = dp[j]+1;
                            if(dp[i] > maxim_f_dp)
                                {
                                    if(maxim_f_dp == 0)
                                        solution[ poz_in_solution ++ ] = numere[j];

                                    maxim_f_dp = dp[i];
                                    solution[ poz_in_solution ++ ] = numere[i];
                                }
                        }
                }
    }

    for(i=1;i<=numar_de_numere;i++)
        cout<<dp[i]<<" ";

    Write(maxim_f_dp,solution);


}

void Write(int number_of_numbers, int numbers[])
{
    g<<number_of_numbers<<newline;
    for(int i = number_of_numbers; i >= 1; i--)
        g<<numbers[i]<<" ";


}

/*void Solve()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        dp[i] = 1;
        for(j=1;j<=i;j++)
            if(v[j]<v[i])
                {
                    if(dp[j]+1 > dp[i])
                        dp[i] = dp[j]+1;
                }

    }
    int mx = 0;
    int poz_sol=1;
    vector <int> sol;
    for(i=1;i<=n;i++)
        {
            if(mx<dp[i])
                mx = dp[i];

        }

    for(i=n;i>=1;i--)
        if(dp[i]==mx)
    {
        sol.push_back(v[i]);

        mx--;
    }

    g<<sol.size()<<endl;


    for(i=sol.size()-1;i>=0;i--)
        g<<sol[i]<<" ";


}*/

int main()
{
    Read();
    Solve_One_Iteration();
}