简单的动态规划,白书上的DP一章里有介绍。
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std;
int a[31][11];
bool G[31][31];
int d[31];
bool lower(int* x, int* y, int n)
{
for (int i = 0; i < n; i++)
if (x[i] >= y[i])return false;
return true;
}
int k, n;
int dp(int i)
{
if (d[i] > 0)return d[i] ;
d[i] = 1;
for (int j = 0; j < k; j++)
if (G[i][j])d[i] = max(d[i], dp(j) + 1) ;
return d[i];
}
void printf_ans(int i)
{
printf("%d ", i + 1);
for (int j = 0; j < k; j++)
{
if (G[i][j] && d[i] == d[j] + 1)
{
printf_ans(j);
break;
}
}
}
int main()
{
//FILE* fp = fopen("in.txt", "r");
while (scanf( "%d %d", &k, &n) == 2)
{
for (int i = 0; i < k; i++)
{
for (int j = 0; j < n; j++)
scanf( "%d", &a[i][j]);
sort(a[i], a[i] + n);
}
memset(G, 0, sizeof(G));
for (int i = 0; i < k; i++)
for (int j = 0; j < k; j++)
if (i != j && lower(a[i], a[j], n))G[i][j] = true;
memset(d, 0, sizeof(d));
for (int i = 0; i < k; i++)
d[i] = dp(i);
int id = 0;
for (int i = 0; i < k; i++)
if (d[i] > d[id])id = i;
printf("%d\n", d[id]);
printf_ans(id);
puts("");
}
return 0;
}