有什么问题可以Email
skyzlxuan@gmail
或者直接留言,我都可以收到。
其实主要的思路就是用s[],数组保存排序后的数列。最后用最长上升子序列……
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
#define M 31
int num[M][M],n,m,maxlen;
bool cmp(int a,int b){
return num[a][0]<num[b][0];
}
void output(int path[],int k,int len){
if(k<0 || !maxlen)
return ;
output(path,path[k],maxlen-1);
cout<<k+1;
putchar(len==maxlen?'\n':' ');
}
bool judge(int q,int p){
for(int i=0;i<m;i++)
if(num[q][i]<=num[p][i])
return false;
return true;
}
int main(){
while(cin>>n>>m){
int i,j,s[M],dp[M],path[M];
for(i=0;i<n;i++){
s[i]=i,dp[i]=1,path[i]=-1;
for(j=0;j<m;j++)
cin>>num[i][j];
sort(num[i],num[i]+m);
}
sort(s,s+n,cmp);
maxlen=1;
int k=0;
for(i=1;i<n;i++){
int temp=1;
for(j=0;j<i;j++){
if(judge(s[i],s[j]) && temp<dp[j]+1){
temp=dp[j]+1;
path[s[i]]=s[j];
}
dp[i]=temp;
if(dp[i]>maxlen)
maxlen=dp[i],k=s[i];
}
}
cout<<maxlen<<endl;
output(path,k,maxlen);
}
return 0;
}