最长上升子序列 先对维数进行排序 然后再对几个盒子进行排序 最后利用vis数组来存路径 最后就是利用回溯来输出路径
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; struct dat { int num[30]; int number; } a[33]; int n,m; int dp[33]; int vis[33],st; bool cmp(dat p, dat q) { for(int i=0; i<n; i++) if(p.num[i]!=q.num[i]) return p.num[i]<q.num[i]; return p.num[0]==q.num[0]; } bool solve(dat p, dat q) { for(int i=0; i<n; i++) if(p.num[i]>=q.num[i]) return false; return true; } void dfs(int x) { if(vis[x]!=-1) dfs(vis[x]); if(x==st) printf("%d\n",a[x].number); else printf("%d ",a[x].number); } int main() { while(scanf("%d %d",&m,&n)==2) { for(int i=0; i<m; i++) { for(int j=0; j<n; j++) scanf("%d",&a[i].num[j]); a[i].number=i+1; sort(a[i].num,a[i].num+n); } sort(a,a+m,cmp); // for(int i=0; i<m; i++) // { // for(int j=0; j<n; j++) // cout << a[i].num[j] << ' '; // cout << a[i].number << endl; // } memset(dp, 0, sizeof(dp)); memset(vis, -1, sizeof(dp)); dp[0]=1; int mm=0; int ans=-1; for(int i=1; i<m; i++) { mm=0; for(int j=0; j<i; j++) { if(solve(a[j],a[i]) && dp[j]>mm) { mm=dp[j]; vis[i]=j; } } dp[i]=mm+1; if(ans<dp[i]) { ans=dp[i]; st=i; } } printf("%d\n",ans); dfs(st); } return 0; }