Mai intai trebuie sa te autentifici.
Cod sursa(job #17635)
Utilizator | Data | 16 februarie 2007 15:14:31 | |
---|---|---|---|
Problema | Pachete | Scor | 0 |
Compilator | c | Status | done |
Runda | Arhiva de probleme | Marime | 1.84 kb |
#include <stdio.h>
#define NMAX 1010
#define INF 1666000666
int min(int a,int b)
{
return ((a) < (b) ? (a):(b));
}
int Ci[NMAX][NMAX], Cj[NMAX][NMAX], A[NMAX][NMAX];
int N, L1[NMAX], L2[NMAX], P[NMAX];
char Venit[NMAX][NMAX];
void afis(int i, int j)
{
if (Venit[i][j] == '1')
{
afis(i+1, j);
printf("%d ", i);
}
if (Venit[i][j] == '2')
{
afis(i, j-1);
printf("%d ", j);
}
}
int main()
{
int i, j, k;
freopen("lsort.in", "r", stdin);
scanf("%d", &N);
for (i = 1; i <= N; i++) scanf("%d", L1+i), P[L1[i]] = i;
for (i = 1; i <= N; i++)
for (j = i+1; j <= N; j++)
Ci[i][j] = Ci[i][j-1]+(P[i]>P[j]);
for (j = 1; j <= N; j++)
for (i = j-1; i >= 1; i--)
Cj[i][j] = Cj[i+1][j]+(P[i]<P[j]);
for (i = 0; i < NMAX; i++)
for (j = 0; j < NMAX; j++) A[i][j] = INF;
for (i = 0; i <= N; i++)
for (j = 0; j <= N; j++)
Venit[i][j] = ' ';
for (i = 1; i <= N; i++)
A[i][i] = P[i], Venit[i][i] = '1';
for (k = 2; k <= N; k++)
for (i = 1; i <= N-k+1; i++)
{
j = i+k-1;
A[i][j] = A[i+1][j]+k*(P[i]-Ci[i][j]);
Venit[i][j] = '1';
if (A[i][j] > A[i][j-1]+k*(P[j]-Cj[i][j]))
A[i][j] = A[i][j-1]+k*(P[j]-Cj[i][j]), Venit[i][j] = '2';
}
for (i = 0; i < NMAX; i++)
for (j = 0; j < NMAX; j++)
if (A[i][j] < 0 || A[i][j] > INF) while(1);
freopen("lsort.out", "w", stdout);
printf("%d\n", A[1][N]);
afis(1, N);
printf("\n");
return 0;
}