46分,52分WA,100分TLE,不多说上代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int cnt,n,ans=1,m[100002],cun[100002],h[100002];
int f(int x) {
if(cun[x])return cun[x];
int sum=1;
for(int i=x; i<=n; i++)
if(m[i]<m[x]) {
if(cun[i])sum=max(cun[i]+1,sum);
else sum=max(f(i)+1,sum);
}
cun[x]=sum;
return sum;
}
int main() {
while(scanf("%d",&m[++n])==1);
n--;
memset(h,0x3f3f3f3f,sizeof(h));
for(int i=1; i<=n; i++) {
ans=max(f(i),ans);
}
for(int i=1; i<=n; i++) {
int po=0;
for(int j=1; j<=cnt; j++) {
if(h[j]>=m[i]&&h[j]<=h[po])po=j;
}
if (po==0) {
i--;
cnt++;
} else {
h[po]=m[i];
}
}
printf("%d\n%d",ans,cnt);
}