Cod sursa(job #609621)

Utilizator maritimCristian Lambru maritim Data 22 august 2011 14:53:40
Problema Subsir 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>

#define MaxN 5010

const int INF = 21903912;

int A[MaxN];
int B[MaxN];
int T[MaxN];
int C[MaxN],D[MaxN];
int N;

void citire(void)
{
	FILE *f = fopen("subsir2.in","r");
	
	fscanf(f,"%d",&N);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d",&A[i]);
	
	fclose(f);
}

void solve(void)
{
	int MAX;
	for(int i=1;i<=N;i++)
	{
		MAX = -INF;
		B[i] = INF;
		for(int j=i-1;j;j--)
			if(A[j] <= A[i] && A[j] > MAX && B[j] < B[i])
			{
				MAX = A[j];
				B[i] = B[j] + 1;
				T[i] = j;
			}
			else if(A[j] > MAX && A[j] <= A[i])
				MAX = A[j];
		if(B[i] == INF)
			B[i] = 1;
	}
}

void ConstrSubsir(int a)
{
	D[0] = 1;
	D[1] = a;
	for(int i=a+1;i<=N;i++)
		if(D[D[0]] == T[i])
			D[++D[0]] = i;
}

void FindSubsir(void)
{
	for(int i=1;i<=N;i++)
		if(B[i] == 1)
		{
			ConstrSubsir(i);
			if(!C[0] || D[0] < C[0])
				for(int i=D[0];i>-1;i--)
					C[i] = D[i];
		}
}

int main()
{
	FILE *g = fopen("subsir2.out","w");
	
	citire();
	solve();
	FindSubsir();
	fprintf(g,"%d\n",C[0]);
	for(int i=1;i<=C[0];i++)
		fprintf(g,"%d ",C[i]);
	for(int i=1;i<=N;i++)
		printf("%d ",B[i]);
	
	fclose(g);
	return 0;
}