Dilworth定理 :对于一个偏序集,其最少链划分数等于其最长反链的长度。
理论上的证明,可以参考http://lam8da.github.io/2010/03/17/dilworth-theorem-about-chain-and-anti-chain/和google
代码很简单就是nlogn求最长上升子序列
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int MAX = 100010;
const int INF = 0x3f3f3f3f;
int x[MAX],N;
int dp[MAX];
int main(void){
scanf("%d",&N);
for(int i=1;i<=N;++i)
scanf("%d",&x[i]);
memset(dp,INF,sizeof(dp));
for(int i=1;i<=N;++i){
*lower_bound(dp+1,dp+1+N,x[i]) = x[i];
}
int u = 1;
for(int i=1;i<=N;++i){
if(dp[i] != INF)
u = i;
else
break;
}
printf("%d\n",u);
return 0;
}