Cod sursa(job #3345489)

Utilizator karinamogaMoga Karina karinamoga Data 9 martie 2026 19:34:21
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

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

vector<int> scmax(int n , vector<int> &v){

    vector<int> dp(n+1);
    vector<int> pred(n+1, 0); // pentru stocarea elementului 

    dp[1] = 1;  // pentru primul element

    for(int i = 2; i <= n; i++){
        // setam dp 1 automat
        dp[i] = 1;
        for(int j = 1; j <= i-1; j++){
            if(v[j] < v[i]){ 
                if(dp[j] + 1 > dp[i]){
                    dp[i] = dp[j] + 1;
                    pred[i] = j;
                }
            }
        }
    }

    int max1 = dp[1];
    int poz_max = 1;
    for (int i = 1; i <= n; i++){
        if(dp[i] > max1){
            max1 = dp[i];
            poz_max = i;
        }
    }

    vector<int> subsir(max1 + 1);

    int curent = poz_max;
    int k = max1;
    
    while(curent != 0){
        subsir[k] = v[curent];
        curent = pred[curent];
        k--;
    }

    return subsir;
} // Se închide funcția scmax

int main(){
    int i, n;
    fin >> n;
    
    vector<int> v(n+1);
    for(i = 1; i <= n; i++) {
        fin >> v[i];
    }

    // Preluăm rezultatul din funcție
    vector<int> rezultat = scmax(n, v);

    // Afișăm pe prima linie lungimea maximă
    fout << rezultat.size() - 1 << "\n";
    
    // Afișăm pe a doua linie elementele
    for(int i = 1; i < rezultat.size(); i++) {
        fout << rezultat[i] << " ";
    }
    
    return 0;
}