Cod sursa(job #992666)

Utilizator andrettiAndretti Naiden andretti Data 2 septembrie 2013 12:29:35
Problema Subsir 2 Scor 96
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define maxn 5005
#define inf 0x3f3f3f3f
using namespace std;

int n,s,len=inf,nr;
int a[maxn];
int best[maxn],p[maxn],up[maxn];
int sol[maxn],aux[maxn];
//up[i] -cel mai mic nr din a care poate continua subs cresc maximal ce se term in i

void read()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
}

void get_sol(int k,int v[maxn])
{
    if(k==0) return;
    get_sol(p[k],v);
    v[++nr]=k;
}

int less_lex()
{
    for(int i=1;i<=nr;i++)
     if(a[aux[i]]<a[sol[i]]) return 1;
     else
      if(a[aux[i]]>a[sol[i]]) return 0;
    return 0;
}

void solve()
{
    int i,j,minn,pc;

    for(i=1;i<=n;i++) up[i]=inf;
    best[1]=1; a[0]=inf;
    for(i=2;i<=n;i++)
    {
        minn=inf; pc=0;
        for(j=1;j<i;j++) if(a[j]<=a[i])
        {
          if(up[j]>a[i])
           if(minn>best[j] || (best[j]==minn && a[j]<a[pc]))
             minn=best[j],pc=j;
          up[j]=min(up[j],a[i]);
        }
       best[i]=best[pc]+1; p[i]=pc;
    }

    for(i=1;i<=n;i++)
     if(up[i]==inf)
     {
         if(len>best[i]) nr=0,get_sol(i,sol),len=best[i];
         else
          if(len==best[i])
          {
              nr=0; get_sol(i,aux);
              if(less_lex()) memcpy(sol,aux,sizeof(aux));
          }
     }
}

void print()
{
    for(int i=1;i<=nr;i++) printf("%d ",sol[i]);
}

int main()
{
    freopen("subsir2.in","r",stdin);
    freopen("subsir2.out","w",stdout);

    read();
    solve();
    printf("%d\n",len);
    print();

    fclose(stdin);
    fclose(stdout);
    return 0;
}