Dilworth定理
导弹拦截系统](https://www.acwing.com/problem/content/1012/)
这个定理和一个对偶定理,讲的意思大概就是,给一个偏序关系,比如说是一个数它出现的位置i在另一个数出现的位置j之前,而且满足ai>aj.那么满足这个偏序关系的链就叫做链.关于链和反链:
链(chain)是一个偏序集S的全序子集(所谓全序是指任意两个元素可以比较).
反链(antichain)是一个偏序集S的子集,其中任意两个元素不可比较。
Dilworth:
最大链的长度等于最少反链覆盖数,而最大反链的长度等于最少链的覆盖数。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1010;
int a[N],f[N],dp[N];
int main()
{
int x,res=0;
int n=1;
while(cin>>x)
{
a[n++]=x;
}
n--;
//求一个最长不增子序列长度。
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
{
if(a[j]>=a[i])
f[i]=max(f[i],f[j]+1);
}
res=max(res,f[i]);
}
cout<<res<<endl;
//求一个最少反链覆盖数等价于最大链长度。
int ans=0;
for(int i=1;i<=n;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(ans,dp[i]);
}
cout<<ans;
return 0;
}