Cod sursa(job #2438216)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 11 iulie 2019 17:29:30
Problema Subsir 2 Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>
#define MAXN int(5e3)

using namespace std;

int N;
int sir[MAXN+1];
int dp[MAXN+1][2];
int sol[MAXN+1];


ofstream fout("subsir2.out");

void read(){
    ifstream fin("subsir2.in");
    fin>>N;

    for(int i=1; i<=N; i++)
        fin>>sir[i];
}

int main()
{
    read();
    sir[0] = -1e6 - 1;

    for(int i=1; i<=N; i++){
        for(int j=i-1; j>=0; j--){
            if(sir[i] > sir[j]){
                dp[i][0] = 1 + dp[j][0];
                dp[j][1] = -1;
                break;
            }
        }
    }

    for(int i=1; i<N; i++){
        for(int j=i+1; j<N+1; j++)
        if(sir[i]<=sir[j]){
            dp[i][1] = -1;
            break;
        }
    }

    int min_len = MAXN+1, pos;
    for(int i=1; i<=N; i++) {
        if(dp[i][1]==0){
            if(min_len > dp[i][0]){
                min_len = dp[i][0];
                pos = i;
            }
            else if(min_len == dp[i][0] && sir[pos] > dp[i][0]){
                pos = i;
            }
        }
    }

    fout<<min_len<<endl;
    min_len--;
    int k=1;
    sol[1] = sir[pos];

    while(min_len){
        for(int i=pos-1; i>0; i--){
            if(dp[i][0]==min_len){
                if(sir[pos]>sir[i]){
                    pos = i;
                }
            }
        }
        sol[++k] = sir[pos];
        min_len--;
    }
    for(; k>0; k--) fout<<sol[k]<<" ";
}