组合技能还TLE
#include <bits/stdc++.h>
using namespace std;
int b[20001],a[20001],dp[20001],k = 1,len = 1,j,ans;
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
while (cin >> a[k]){
k++;
}
k--;
for (int i = 1;i <= k;++i){
dp[i] = 1;
for (int j = 1;j < i;++j)
if (a[j] >= a[i])
dp[i] = max(dp[i],dp[j]+1);
ans = max(dp[i],ans);
}
cout << ans << endl;
len = 1;
b[1] = a[1];
for (int i = 2;i <= k;++i){
if (a[i] > b[len]) b[++len] = a[i];
else{
j = lower_bound(b,b+len,a[i]) - b;
b[j] = a[i];
}
}
cout << len;
return 0;
}
给解释
@清空