描述:像刘汝佳书上一样需要转化成有向图,然后再统计路最长的就可以了
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define N 32
int n,m,sum;
int num[N][12],s[N],pos[N];
bool next[N][N];
int cmp(const void *p1,const void *p2)
{
return *(int *)p1 - *(int *)p2;
}
void dfs(int cur,int count)
{
int c=0;
for(int i=1; i<=n; i++)
if(next[cur][i])
{
s[count]=i;
c=1;
dfs(i,count+1);
}
if(!c&&count>sum)
{
sum=count;
for(int i=0; i<count; i++) pos[i]=s[i];
}
}
int main()
{
// freopen("a.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(next,false,sizeof(next));
for(int i=1; i<=n; i++)
{
for(int j=0; j<m; j++) scanf("%d",&num[i][j]);
qsort(num[i],m,sizeof(int),cmp);
for(int j=1; j<i; j++)
{
int flag=0;
for(int k=0; k<m; k++)
if(num[i][k]>num[j][k]) continue;
else flag=1;
if(!flag) next[j][i]=true;
else
{
flag=0;
for(int k=0; k<m; k++)
if(num[j][k]>num[i][k]) continue;
else flag=1;
if(!flag) next[i][j]=true;
}
}
}
sum=0;
for(int i=1; i<=n; i++)
{
s[0]=i;
dfs(i,1);
}
printf("%d\n%d",sum,pos[0]);
for(int i=1; i<sum; i++) printf(" %d",pos[i]);
puts("");
}
return 0;
}
103 - Stacking Boxes
最新推荐文章于 2015-03-31 23:24:27 发布