题意:有k个n维的东东,对于其中的两个,如果其中的一个东东的每一维都大于另一个东东的其中一维,那么就说可以嵌套它,求这k个东东互相嵌套的最长路径。
——>>一个东东能嵌套另一个东东,则其n维元素排序后一定是每一维的元素都比另一个东东n维排序后的每一维元素都要大。
排序,建好图,记忆化搜索一次。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Box
{
int demension;
int e[20];
bool operator < (const Box& b) const
{
for(int i = 1; i <= demension; i++)
if(e[i] >= b.e[i])
return 0;
return 1;
}
void boxSort()
{
sort(e+1, e+1+demension);
}
};
int f[40], k;
int G[40][40];
Box box[40];
int dp(int i)
{
int& ans = f[i];
if(ans > 0) return ans;
ans = 1;
for(int j = 1; j <= k; j++)
if(G[i][j]==1)
ans = max(ans, dp(j)+1);
return ans;
}
void print(int i)
{
for(int j = 1; j <= k; j++)
if(G[i][j] && f[i] == f[j]+1)
{
printf(" %d", j);
print(j);
break;
}
}
int main()
{
int n, i, j;
while(~scanf("%d%d", &k, &n))
{
for(i = 1; i <= k; i++)
{
for(j = 1; j <= n; j++)
{
scanf("%d", &box[i].e[j]);
box[i].demension = n;
}
box[i].boxSort();
}
memset(G, 0, sizeof(G));
for(i = 1; i <= k; i++) //建图
for(j = 1; j <= k; j++)
if(box[i] < box[j]) G[i][j] = 1;
memset(f, 0, sizeof(f));
for(i = 1; i <= k; i++) dp(i); //dp求解
int id = 1;
for(i = 2; i <= k; i++) //找最长路
if(f[i] > f[id])
id = i;
printf("%d\n", f[id]);
printf("%d", id);
print(id);
printf("\n");
}
return 0;
}