思路
方法和刘汝家介绍的一样,先利用关系建图,然后dp计算从每个点开始的最大长度。需要注意的是,建图之前需要将各个维度从小到大进行排序。进行排序可以保证建图的完整性。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
int n,k;
int tmp[40][40];
int mp[40][40];
int dp[50];
int before[40];
int dfs(int pos)
{
int& ans=dp[pos];
if(ans>0) return ans;
ans=1;
for(int j=1;j<=n;j++)
{
if(mp[pos][j])
{
ans=max(ans,dfs(j)+1);
}
}
return ans;
}
void print(int i)
{
printf("%d ",i);
for(int j=1;j<=n;j++)
{
if(mp[i][j]&&dp[i]==dp[j]+1)
{
print(j);
break;
}
}
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(mp,0,sizeof(mp));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
scanf("%d",&tmp[i][j]);
}
}
for(int i=1;i<=n;i++)
{
sort(tmp[i]+1,tmp[i]+1+k);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int f=0;
for(int d=1;d<=k;d++)
{
if(tmp[i][d]>=tmp[j][d])
{
f=1;
break;
}
}
if(f==0)
{
mp[i][j]=1;
}
}
}
int ans=0;
int flag=0;
for(int i=1;i<=n;i++)
{
int tmp=dfs(i);
if(tmp>ans)
{
ans=tmp;
flag=i;
}
}
printf("%d\n",ans);
print(flag);
cout<<endl;
}
return 0;
}