#include <bits/stdc++.h> using namespace std; #define IOS ios::sync_with_stdio(false), cin.tie(0); typedef long long LL; //const int N=; int n; int main() { IOS cin>>n; vector<int> a(n), f(n, 1), dp(n, 1); for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n; i++) for(int j=0; j<i; j++) if(a[i]>a[j]) f[i]=max(f[i], f[j]+1); else dp[i]=max(dp[i], dp[j]+1); int ans=0, res=0; for(int i=0; i<n; i++) ans=max(ans, f[i]), res=max(res, dp[i]); cout<<res<<"\n"<<ans; return 0; }
根据Dilworth定理:最少的下降序列个数就等于整个序列最长上升子序列的长度
数据范围比较小,双重for循环即可,当然也可以二分优化