Cod sursa(job #1754504)

Utilizator enacheionutEnache Ionut enacheionut Data 8 septembrie 2016 13:24:42
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

vector<int> CitireInput(int &dimensiuneSir)
{
    ifstream in("scmax.in");
    in>> dimensiuneSir;
    vector<int> numere(dimensiuneSir + 1);

    for( int i = 1; i<=dimensiuneSir; ++i )
    {
        in>> numere[i];
    }
    return numere;
}

int CautareLungimeMaxima(vector<int> numere, vector<int> &dimensiuneMaxima,
                          vector<int> &pozitie, int dimensiuneSir, int &pozitieStartSir)
{
    int dimensiuneSubsirMaximal = 1;
    pozitieStartSir = dimensiuneSir;

    for( int i = dimensiuneSir-1; i >= 1; --i )
    {
        for( int j = i+1; j <= dimensiuneSir; ++j )
        {
            if( numere[i] < numere[j] && dimensiuneMaxima[i] < dimensiuneMaxima[j] + 1 )
            {
                dimensiuneMaxima[i] = dimensiuneMaxima[j] + 1;
                pozitie[i] = j;

                if( dimensiuneMaxima[i] > dimensiuneSubsirMaximal )
                {
                    dimensiuneSubsirMaximal = dimensiuneMaxima[i];
                    pozitieStartSir = i;
                }
            }
        }
    }
    return dimensiuneSubsirMaximal;
}

void ScrieRezultat(vector<int> numere, vector<int> pozitie,
                    int pozitieStartSir, int dimensiuneSubsirMaximal)
{
    ofstream out("scmax.out");
    out<< dimensiuneSubsirMaximal<< endl;

    int i = pozitieStartSir;
    while( i != -1 )
    {
        out<< numere[i]<<" ";
        i = pozitie[i];
    }

    out.close();
}

int main()
{
    int dimensiuneSir;
    int pozitieStartSir;

    vector<int> numere = CitireInput(dimensiuneSir);
    vector<int> dimensiuneMaxima(dimensiuneSir + 1, 1);
    vector<int> pozitie(dimensiuneSir + 1, -1);

    int dimensiuneSubsirMaximal = CautareLungimeMaxima(numere, dimensiuneMaxima, pozitie, dimensiuneSir, pozitieStartSir);

    ScrieRezultat(numere, pozitie, pozitieStartSir, dimensiuneSubsirMaximal);

    return 0;
}