最开始坑在嵌套矩形的规则,如果边长相等不能嵌套。
bool can_connect(int index1,int index2)
{
for (int i=0;i<K;i++)
if (input[index1][i]>=input[index2][i]) return false;
return true;
}
最开始这里已知WA,就是之前是只有>号,不是大于等于号
#include <map>
#include <set>
#include <list>
#include <cmath>
#include<cctype>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b)
{
return a % b == 0 ? b : gcd(b, a % b);
}
bool G[40][40];
int input[40][40];
int N,K;
int leap,res[40];
int dp[40];
bool ok;
void debug()
{
for (int i=0;i<N;i++)
{
for (int j=0;j<K;j++)
printf("%d ",input[i][j]);
putchar('\n');
}
for (int i=0;i<N;i++)
{
for (int j=0;j<N;j++)
if (G[i][j]) putchar('1');
else putchar('0');
printf("\n");
}
}
bool can_connect(int index1,int index2)
{
for (int i=0;i<K;i++)
if (input[index1][i]>=input[index2][i]) return false;
return true;
}
void read()
{
memset(G,false,sizeof(G));
for (int i=0;i<N;i++)
{
for (int j=0;j<K;j++)
scanf("%d",&input[i][j]);
sort(input[i],input[i]+K);
}
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
if (i==j) continue;
else if (can_connect(i,j))
G[i][j]=true;//i可以套在j里
//debug();
}
int DP(int cur)
{
int &ans=dp[cur];
if (ans!=-1) return ans;
ans=1;
for (int i=0;i<N;i++)
if (G[cur][i])
ans=max(ans,DP(i)+1);
return ans;
}
void print(int pos)
{
if (ok) printf(" %d",pos+1);
else {ok=true;printf("%d",pos+1);}
for (int i=N-1;i>=0;i--)
if (G[pos][i] && dp[i]+1==dp[pos]) {print(i);break;}
}
int main()
{
//freopen("sample.txt","r",stdin);
while (scanf("%d%d",&N,&K)==2)
{
read();
memset(dp,-1,sizeof(dp));
int ans=-1,pos;
for (int i=0;i<N;i++)
{
int tmp=DP(i);
if (tmp>ans)
{
ans=tmp;
pos=i;
}
}
printf("%d\n",ans);
ok=false;
print(pos);
putchar('\n');
}
return 0;
}