Cod sursa(job #4333)

Utilizator cos_minBondane Cosmin cos_min Data 2 ianuarie 2007 18:21:33
Problema Subsir 2 Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <fstream>
using namespace std;

#define in "subsir2.in"
#define out "subsir2.out"
#define dim 5001

int v[dim], t[dim], a[dim], sel[dim];
int n;

void ReadData();
void Solve();
int Ok(int,int);

int main()
{
    ReadData();
    Solve();
    
    return 0;
}

void ReadData()
{
     freopen(in,"r",stdin);
     
     scanf("%d",&n);
     for ( int i = 1; i <= n; i++ )
     {
         scanf("%d",v+i);
     }
}

int Ok(int k,int p)
{
    for ( int i = k+1; i < p; i++ )
        if ( v[i] >= v[k] && v[i] <= v[p] ) return 0;
    return 1;
}

void Solve()
{
     freopen(out,"w",stdout);
     
     for ( int i = 1; i <= n; i++ ) a[i] = 1;
     
     a[1] = 1;
     
     for ( int i = 1; i < n; i++ )
     {
         a[i] = 1;
         
         int minim = 32001;
         int poz = i;
         
         for ( int j = i+1; j <= n; j++ )
         {
             if ( !Ok(i,j) ) continue;
             if ( v[i] <= v[j] && minim > a[j] + 1 )
             {
                  minim = a[j] + 1;
                  poz = j;
             }
             
         }
         if ( minim != 32001 )
         {
              a[i] = minim;
              t[i] = poz;
         }
         else
         {
             t[i] = i;
             a[i] = 1;
         }
     }
     
     for ( int i = n; i >= 1; i-- )
     {
         if ( t[i] != i && a[i] <= a[t[i]] ) a[i] += (a[t[i]]-a[i]+1); 
     }
     
     int minim = -1;
     for ( int i = 1; i <= n; i++ )
     {
       //  printf("%d ", a[i]);
         if ( minim < a[i] ) 
         {
              minim = a[i];
         }
     }
     printf("%d\n",minim);
}