Cod sursa(job #985905)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 17 august 2013 14:31:30
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

const int MAX_N = 1002;
const int MAX_K = 52;

typedef struct clasa {
    int nr;
    int a[MAX_K];
};

int N, K, sol;
int dp[MAX_N], p[MAX_N], temp[MAX_K], pos[MAX_N];
vector < int > A[MAX_N];
bool C[MAX_N][MAX_N], used[MAX_N];
clasa v[MAX_N];

inline bool cmp(clasa a, clasa b) {
    for(int i = 1; i <= K; ++i)
        if(a.a[i] >= b.a[i])
            return 0;
    return 1;
}

int main() {
    ifstream f("album.in");
    ofstream g("album.out");

    f >> N >> K;
    for(int i = 1; i <= N; ++i) {
        for(int j = 1; j <= K; ++j)
            f >> temp[j];
        sort(temp+1, temp+K+1);
        for(int j = 1; j <= K; ++j)
            v[i].a[j] = temp[j];
        v[i].nr = i;
    }

    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j) {
            if(cmp(v[i], v[j]) == 1)
                A[j].push_back(i), C[i][j] = 1;
        }
    for(int i = 1; i < N; ++i)
        for(int j = i + 1; j <= N; ++j)
            if(C[v[j].nr][v[i].nr]) {
                clasa T;
                T = v[i], v[i] = v[j], v[j] = T;
            }
    for(int i = 1; i <= N; ++i)
        pos[v[i].nr] = i;
    int Nr = N;
    while(Nr) {
        ++sol;
        for(int i = 1; i <= N; ++i)
            if(!used[i]) {
                dp[i] = 1;
                for(size_t j = 0; j < A[i].size(); ++j) {
                    int x = pos[A[i][j]];
                    if(used[x])
                        continue;
                    if(C[x][i] && dp[x] + 1 > dp[i])
                        dp[i] = dp[x]+1, p[i] = x;
                }
            }
            else dp[i] = -1;
        int Max = 0, ind = 0;
        for(int i = 1; i <= N; ++i)
            if(dp[i] > Max)
                Max = dp[i], ind = i;
        while(ind)
            used[ind] = 1, ind = p[ind];
        Nr -= Max;
    }

    g << sol << "\n";

    f.close();
    g.close();

    return 0;
}