解题关键:由Dilworth定理(最小反链划分 == 最长链)可知最少的下降序列个数就等于整个序列最长上升子序列的长度,此题即转化为求最长上升子序列的长度。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll a[500020],dp[500002];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    fill(dp,dp+n,INF);
    for(ll i=0;i<n;i++){
        *lower_bound(dp,dp+n,a[i])=a[i];
    }
    printf("%lld\n",lower_bound(dp,dp+n,INF)-dp);
}

 

相关文章:

  • 2021-07-01
  • 2021-07-30
  • 2021-05-05
  • 2021-11-27
  • 2021-06-27
  • 2021-04-04
  • 2022-12-23
猜你喜欢
  • 2021-08-07
  • 2022-12-23
  • 2022-12-23
  • 2021-07-06
  • 2021-12-01
相关资源
相似解决方案