Cod sursa(job #213817)

Utilizator katakunaCazacu Alexandru katakuna Data 11 octombrie 2008 18:55:48
Problema Subsir 2 Scor 47
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<stdio.h>
#define MAX 1000011

int d[5111],t[5111],sol[5111],p,n,i,v[5111],a[5111],b[5111],j,min;

int cmp(){
int i;

  for(i=1;i<=min;i++){
    if( v[d[i]] > v[sol[i]] )
    return 0;
  }

return 1;
}


int main(){

FILE *f=fopen("subsir2.in","r");
FILE *g=fopen("subsir2.out","w");

fscanf(f,"%d",&n);

   for(i=1;i<=n;i++){
   fscanf(f,"%d",&v[i]);
   }

v[0]=-MAX;

     for(i=1;i<=n;i++){

       for(j=i-1;j>=0;j--){
         if(v[i] > v[j]){
         b[j]=1;

            if(a[i] == a[j]+1 && v[j] < v[t[i]] ){
            a[i] = a[j]+1;
            t[i]=j;
            }

            if(a[i] < a[j]+1){
            a[i] = a[j]+1;
            t[i]=j;
            }
            
         }
       }

     }

min=5111;
sol[1]=MAX;

     for(i=1;i<=n;i++){
       if(!b[i]&&a[i]==min){
       p=i;
         for(j=min;j>=1;j--){
         d[j]=p;
         p=t[p];
         }

         if(cmp()){
            for(j=1;j<=min;j++)
            sol[j]=d[j];
         }

       }

       if(!b[i]&&a[i]<min){
       min=a[i];
       p=i;
         for(j=min;j>=1;j--){
         sol[j]=p;
         p=t[p];
         }

       }
     }

  fprintf(g,"%d\n",min);
  for(i=1;i<=min;i++)
  fprintf(g,"%d ",sol[i]);

fclose(f);
fclose(g);

return 0;
}