//贪心加dp #include<iostream> using namespace std ; const int N=1010; int n; int q[N]; int f[N]; int g[N];//存每个序列末尾的数字 int main() { while(cin>>q[n]) n++; int res=0; for(int i=0; i<n; i++) { f[i]=1; for(int j=0; j<i; j++) { if(q[j]>=q[i]) f[i]=max(f[i],f[j]+1); res=max(res,f[i]); } } cout<<res<<endl; int cnt=0;//表示序列个数 for(int i=0; i<n; i++) { int k=0;//表示已经遍历的序列的个数 while(k<cnt&&g[k]<q[i])//没有遍历完所有序列,而且序列最后小于q[i] k++;//往后找 g[k]=q[i];//当上述循环结束的时候,要么遍历完所有数组,要么找到了小于的 if(k>=cnt) cnt++;//第一次k为0,cnt为0 所以直接 g[k]=q[i] //因为此时k>=cnt 所以cnt++ 即有一个序列 } cout<<cnt<<endl; return 0; }