Cod sursa(job #1171488)

Utilizator iulishorIulian Popescu iulishor Data 15 aprilie 2014 19:59:53
Problema Cutii Scor 40
Compilator cpp Status done
Runda ubb_acm_etapa_individuala1 Marime 1.67 kb
# include <fstream>
# include <cstring>
# include <algorithm>
# include <vector>

# define dim 3505

using namespace std;

ifstream fin( "cutii.in" );
ofstream fout( "cutii.out" );

int n, t;

struct cutie
{
    int X, Y, Z;
};

cutie a[ dim ];
int dm[ dim ], dp[ dim ];

inline bool cmp( cutie a, cutie b )
{
    if ( a.X == b.X && a.Y == b.Y )
        return a.Z < b.Z;
    else
    if ( a.X == b.X )
        return a.Y < b.Y;
    else
        return a.X < b.X;
}

void afiseaza()
{
    int i;
    for ( i = 1 ; i <= n ; i++ )
        fout << a[ i ].X << " " << a[ i ].Y << " " << a[ i ].Z << "\n";
    fout << "\n";
}

void init()
{
    int i;
    for ( i = 1 ; i <= n ; i++ )
        dp[ i ] = 0;
}

void rezolva()
{
    int maxim, sol = 1, ok = 0;

    dp[ n ] = dm[ n ] =  1;

    for ( int i = n - 1 ; i >= 1 ; i-- )
    {
        maxim = 0;
        ok = 0;
        for ( int j = i + 1 ; j <= n && ok == 0 ; j ++ )
        {
            if ( a[ i ].X < a[ j ].X && a[ i ].Y < a[ j ].Y && a[ i ].Z < a[ j ].Z && maxim < dp[ j ]  )
                maxim = dp[ j ];
            if ( maxim == dm[ i + 1 ] )
                ok = 1;
        }
            dp[ i ] = maxim + 1;
            dm[ i ] = max( dm[ i + 1 ], maxim + 1 );
            if ( sol < dp[ i ] )
                sol = dp[ i ];
    }

    fout << sol << "\n";
}

void citire()
{

    fin >> n >> t;

    for ( ; t; --t )
    {
        for (int j = 1 ; j <= n ; j++ )
            fin >> a[ j ].X >> a[ j ].Y >> a[ j ].Z;
        sort( a + 1, a + n + 1, cmp );
        rezolva();
        init();
    }
}

int main()
{
    citire();
    return 0;
}