Pagini recente » Cod sursa (job #2236050) | Cod sursa (job #226746) | Cod sursa (job #1097698) | Cod sursa (job #1781709) | Cod sursa (job #401714)
Cod sursa(job #401714)
#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;
}