Pagini recente » Cod sursa (job #2593949) | Cod sursa (job #560801) | Cod sursa (job #31046) | Rating Katherine Swan (Katherine46784) | Cod sursa (job #609621)
Cod sursa(job #609621)
#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;
}