Cod sursa(job #17636)

Utilizator diaDiana Adrisor dia Data 16 februarie 2007 15:14:48
Problema Pachete Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.85 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("pachete.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;
        
}