Cod sursa(job #1427994)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 3 mai 2015 14:48:17
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
using namespace std;
const int MAXN=100005;
ifstream in("scmax.in");
ofstream out("scmax.out");
int A[MAXN];
int dp[MAXN];
int prec[MAXN];
int subsir[MAXN];
int main()
{
    int n;
    in>>n;
    for(int i=1;i<=n;i++)
        in>>A[i];
    int mx_val=1;
    int mx_poz=1;
    for(int i=1;i<=n;i++)
    {
        //luam elementul A[i]
        dp[i]=1;
        for(int j=1;j<i;j++)
        {
            //dp[i] = 1+max(dp[j]) , A[j]<A[i]
            if(A[j]<A[i])
                if(dp[i] < 1+dp[j]) {
                    dp[i]=dp[j]+1;
                    prec[i] = j;
                }
        }
        /// a :     1 2 3 4 7 1 2
        /// dp      1 2 3 4 5 1 2
        /// prec:   0 1 2 3 4 0 6


        /// a:    10 5 7 1 2 0 5
        /// dp:   1  1 2 1 2 1 3
        /// prec: 0  0 2 0 4 0 5

        /// s-a terminat forul, avem calculat dp[i]
        if(dp[i]>mx_val)
        {
            mx_val=dp[i];
            mx_poz=i;
        }
    }
    out<<mx_val<<"\n";
    int pozact=mx_poz;
    while(pozact>0)
    {
        subsir[dp[pozact]]=A[pozact];
        pozact=prec[pozact];
    }
    for(int i=1;i<=mx_val;i++)
        out<<subsir[i]<<" ";
    return 0;
}