/* 最长递减子序列, 题目说的是 每头大象都有体重和IQ 要证明 随着 体重的增加智商 在不断的减少的最长序列 解 : 先对 体重进行一次排序 ,排完后 LIS(最长递增(减)子序列) */ #include <cstdio> #include <string.h> #include <iostream> #include <algorithm> #include <stack> using namespace std; struct Elephant { int num,W,S; bool operator <(const Elephant &T)const { return W<T.W||(W==T.W&&num<T.num); } }T[10005]; int dp[10005],per[10005]; int main() { int j,i,W,S,num=0,maxv=1; while(scanf("%d%d",&W,&S)==2){ T[num].W=W; T[num].S=S; T[num].num=num+1; num++; } sort(T,T+num); for(i=0;i<num;i++) { dp[i]=1; per[i]=-1; } for(i=0;i<num;i++) for(j=0;j<i;j++) if(T[i].S<T[j].S&&T[i].W>T[j].W&&(dp[i]<dp[j]+1)){ dp[i]=(dp[j]+1); per[i]=j; if(dp[i]>maxv) maxv=dp[i]; } for(i=num-1;i>=0;i--) if(dp[i]==maxv) break; stack<int>Q; printf("%d ",maxv); W=i; S=T[W].num; Q.push(S); while(per[W]!=-1){ W=per[W]; S=T[W].num; Q.push(S); } while(!Q.empty()){ S=Q.top(); printf("%d ",S);Q.pop();} return 0; }