Dilworth定理

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;
}
posted @ 2020-09-14 14:54  30天CF上蓝!!!  阅读(139)  评论(0编辑  收藏  举报