Cod sursa(job #1206718)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 10 iulie 2014 23:50:04
Problema Subsir 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <cstdio>
#include <algorithm>
#define Nmax 5005
#define INF 2000000000

using namespace std;

int N,a[Nmax],dp[Nmax],prev[Nmax];
bool valid[Nmax];

inline void LIS()
{
    int i,j,p,minim,maxim;
    dp[1]=1;
    for(i=2;i<=N;++i)
    {
        minim=INF; p=0; maxim=0;
        for(j=i-1;j;--j)
        {
            if(a[j]>maxim)
                if((a[j]<=a[i] && minim>dp[j]) || ((a[j]<=a[i] && minim==dp[j]) && a[j]<a[p]))
                {
                    minim=dp[j]; p=j;
                }
            maxim=max(maxim,a[j]);
        }
        if(minim==INF)
            dp[i]=1;
        else
            dp[i]=minim+1;
        prev[i]=p;
    }
}

inline int Cmp(int a[], int n, int b[], int m)
{
    int i;
    for(i=1;i<=n && i<=m && a[i]==b[i];++i);
    if(i==n+1)
    {
        if(i==m+1)
            return 0;
        else
            return 2;
    }
    else
    {
        if(i==m+1)
            return 1;
        else
        {
            if(a[i]>b[i])
                return 1;
            return 2;
        }
    }
}

int main()
{
    int i,maxim,minim=INF,aux[Nmax],lenaux,ans,sol[Nmax],lensol,j;
    freopen ("subsir2.in","r",stdin);
    freopen ("subsir2.out","w",stdout);
    scanf("%d", &N);
    for(i=1;i<=N;++i)
        scanf("%d", &a[i]);
    valid[N]=true; maxim=a[N];
    for(i=N-1;i;--i)
        if(maxim<a[i])
        {
            valid[i]=true;
            maxim=a[i];
        }
    LIS();
    for(i=1;i<=N;++i)
        if(valid[i])
            minim=min(dp[i],minim);
    printf("%d\n", minim);
    lensol=1; sol[1]=INF;
    for(i=1;i<=N;++i)
        if(valid[i] && dp[i]==minim)
        {
            lenaux=0;
            for(j=i;j;j=prev[j])
                aux[++lenaux]=a[j];
            reverse(aux+1,aux+lenaux+1);
            if(Cmp(aux,lenaux,sol,lensol)==2)
            {
                lensol=lenaux; ans=i;
                for(j=1;j<=lenaux;++j)
                    sol[j]=aux[j];
            }
        }
    for(lenaux=0,j=ans;j;j=prev[j])
        aux[++lenaux]=j;
    reverse(aux+1,aux+lenaux+1);
    for(i=1;i<=minim;++i)
        printf("%d ", aux[i]);
    printf("\n");
    return 0;
}