Cod sursa(job #790086)

Utilizator GrimpowRadu Andrei Grimpow Data 20 septembrie 2012 12:51:54
Problema Elimin 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<stdio.h>
#include<string.h>

char v[2011];
short q,w,m,p,u,sol[2011],ll,a[2011][2011],r[12][2011],l[12][2011],i,j,n,c;


int main(){

v[0]=' ';

FILE *f=fopen("elimin2.in","r");
fscanf(f,"%s",v+1);
n=strlen(v);n--;
fclose(f);

   for(i=0;i<=9;i++){
     for(j=1;j<=n;j++){
       if(i == v[j] - 48)
       r[i][j] = j;
       else
       r[i][j]=r[i][j-1];
     }
   }
   
   for(i=0;i<=9;i++){
     for(j=n;j>=1;j--){

       if(i == v[j] - 48)
       l[i][j] = j;
       else
       l[i][j]=l[i][j+1];
     }
   }

   for(i=1;i<=n;i++)
   a[i][i]=1;

   for(ll=2;ll<=n;ll++){
     for(i=1;i+ll-1<=n;i++){
     j=i+ll-1;
     q=a[i+1][j];
     w=a[i][j-1];
     //a[i][j] = max(a[i+1][j],a[i][j-1]);
     if(q>w)a[i][j]=q;
     else   a[i][j]=w;

     c=v[i]-48;

       if(i<=r[c][j] - 1){
       //a[i][j] = max(a[i][j], a[i+1][r[c][j]-1] + 2);
       q=a[i+1][r[c][j]-1] + 2;
          if(a[i][j] < q)a[i][j]=q;
       }

     c=v[j]-48;
     
       if(l[c][i] <= j-1){
       //a[i][j] = max(a[i][j], a[l[c][i]+1][j-1] + 2);
       q=a[l[c][i]+1][j-1] + 2;
          if(a[i][j] < q) a[i][j]=q;
       }
     }
   }

int X=a[1][n];
int x=1,y=n;

if(X % 2 == 0) m=X>>1;
else           m=(X>>1) + 1;
p=0;u=X+1;

  for(i=1;i<=m;i++){
    for(c=9;c>=0;c--){

      if(a[ l[c][x] ][ r[c][y] ] == X ){
      p++; sol[p]=c;
      u--; sol[u]=c;
      x=l[c][x]+1;
      y=r[c][y]-1;
      X-=2;
      break;
      }
      
    }
  }

p=1;
u=a[1][n];

  while(!sol[p]){
  p++;
  u--;
  }

FILE *g=fopen("elimin2.out","w");
  for(i=p;i<=u;i++)
  fprintf(g,"%d",sol[i]);

fclose(g);

return 0;
}