Cod sursa(job #245615)

Utilizator katakunaCazacu Alexandru katakuna Data 18 ianuarie 2009 13:38:56
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<stdio.h>
#include<string.h>

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

int max(int a,int b){
if(b>a) return b;
return a;
}

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++){
     r[i][j]=r[i][j-1];
       if(i == v[j] - 48)
       r[i][j] = j;
     }
   }
   
   for(i=0;i<=9;i++){
     for(j=n;j>=1;j--){
     l[i][j]=l[i][j+1];
       if(i == v[j] - 48)
       l[i][j] = j;
     }
   }

   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;
     a[i][j] = max(a[i+1][j],a[i][j-1]);
     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);

     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);

     }
   }

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

if(X % 2 == 0) m=X/2;
else           m=X/2 + 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;
      }
    }
  }

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

fclose(g);

return 0;
}