Cod sursa(job #401714)

Utilizator mihaionlyMihai Jiplea mihaionly Data 23 februarie 2010 08:07:48
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
using namespace std;
#define nmax 5010
#define max(a,b) ((a>b)?(a):(b))
int n,m,mns;
int num[nmax];
int din[nmax][nmax];
int a[nmax],ord[nmax],sol[nmax];
void read()
 {
 int i;
 ifstream f("secv.in");
 f>>n;
 for(i=1;i<=n;i++)
  {
  f>>a[i];
  ord[i]=a[i];
  }
 }
int aux[nmax];
void msort(int l,int r)
 {
 int m=(l+r)/2;
 if(l==r)
  return;
 msort(l,m);
 msort(m+1,r);
 int k=l-1,i,j;
 for(i=l,j=m+1;i<=m||j<=r;)
  {
  if(j>r || (i<=m && ord[i]<ord[j]))
   aux[++k]=ord[i++];
  else
   aux[++k]=ord[j++];
  }
 for(i=l;i<=r;i++) ord[i]=aux[i];
 }
void aranj()
 {
 int k,i;
 k=0;
 for(i=1;i<=n;i++)
  {
  ord[++k]=ord[i];
  ++num[k];
  while(i<=n&&ord[i]==ord[i+1])
   {
   ++num[k];
   ++i;
   }
  }
 m=k;
 }
void find(int l,int c,int nr)
 {
 if(nr>m||(!c&&!l))
  {
  if(nr>m&&mns>sol[1]-sol[nr])
   mns=sol[1]-sol[m];
  return;
  }
 if(ord[l]==a[c])
  {
  sol[nr]=c;
  find(l-1,c-1,nr+1);
  }
 else if(din[l][c]==din[l-1][c])
  find(l-1,c,nr);
 else if(din[l][c]==din[l][c-1])
  find(l,c-1,nr);
 }
void solve()
 {
 msort(1,n);
 aranj();
 int i,j;
 for(i=1;i<=m;i++)
  for(j=1;j<=n;j++)
   if(a[j]==ord[i])
	din[i][j]=din[i-1][j-1]+1;
   else
	din[i][j]=max(din[i-1][j],din[i][j-1]);
 find(m,n,1);
 }
int main()
 {
 read();
 mns=nmax;
 solve();
 ofstream g("secv.out");
 mns++;
 g<<mns;
 }