多维矩形嵌套,和二维的一模一样。判断能否嵌套时需要先排序。
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=30+5;
int G[maxn][maxn],dp[maxn];
struct node{
int pos[15];
};
node a[maxn];
int n,k;
int solve(int i){
if(dp[i]>0) return dp[i];
int ans=1;
for(int j=0;j<n;++j){
if(G[i][j]) ans=max(ans,solve(j)+1);
}
return dp[i]=ans;
}
vector<int>way;
void print(int i){
way.push_back(i+1);
for(int j=0;j<n;++j){
if(G[i][j]&&dp[j]+1==dp[i]){
print(j);
break;
}
}
}
int main(){
while(scanf("%d%d",&n,&k)==2){
for(int i=0;i<n;++i){
for(int j=0;j<k;++j){
scanf("%d",&a[i].pos[j]);
}
sort(a[i].pos,a[i].pos+k);
}
memset(dp,0,sizeof(dp));
memset(G,0,sizeof(G));
for(int i=0;i<n;++i)
for(int j=0;j<n;++j){
node &u=a[i],&v=a[j];
int flag=1;
for(int c=0;c<k;++c){
if(u.pos[c]>=v.pos[c]){
flag=0;
break;
}
}
if(flag) G[i][j]=1;
}
int ans=1;
for(int i=0;i<n;++i){
ans=max(ans,solve(i));
}
printf("%d\n",ans);
//print
for(int i=0;i<n;++i)
if(dp[i]==ans){
print(i);
break;
}
for(int i=0;i<way.size();++i){
if(i==0) printf("%d",way[i]);
else printf(" %d",way[i]);
}
printf("\n");
way.clear();
}
return 0;
}
如有不当之处欢迎指出!