Pagini recente » Cod sursa (job #132710) | Cod sursa (job #2627681) | Cod sursa (job #2537506) | Cod sursa (job #3281200) | Cod sursa (job #985905)
Cod sursa(job #985905)
#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;
}