题意:有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; }