Cod sursa(job #702570)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 1 martie 2012 23:02:26
Problema Subsir 2 Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<cstdio>
void read(),solve(),recursiv(int);
int i,n,A[5100],dad[5100],NR[5100],DP[5100],j,MAX,MAXNR,st;
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("subsir2.in","r",stdin);
	freopen("subsir2.out","w",stdout);
	scanf("%d",&n);
}
void solve()
{
	for(i=1;i<=n;i++)
	{
		scanf("%d",&A[i]);
		DP[i]=1;
		NR[i]=0;
		for(j=i-1;j>=1;j--)
		{
			if(A[j]>A[i])continue;
			if(DP[i]<DP[j]+1)
			{
				DP[i]=DP[j]+1;
				NR[i]=NR[j]+A[i]-A[j];
				dad[i]=j;
				continue;
			}
			if(DP[i]==DP[j]+1)
				if(NR[i]>NR[j]+A[i]-A[j])
				{
					NR[i]=NR[j]+A[i]-A[j];
					dad[i]=j;
				}
		}
	}
	for(i=1;i<=n;i++)
	{
		if(DP[i]>MAX)
		{
			MAX=DP[i];
			MAXNR=NR[i];
			st=i;
			continue;
		}
		if(DP[i]==MAX&&MAXNR>NR[i])
		{
			MAXNR=NR[i];
			st=i;
		}
	}
	recursiv(st);
}
void recursiv(int X)
{
	if(dad[X])recursiv(dad[X]);
	printf("%d ",X);
}