导弹拦截n方解法

13.导弹拦截 O ( n 2 ) O(n^2) O(n2)

这个定理和一个对偶定理,讲的意思大概就是,给一个偏序关系,比如说是一个数它出现的位置i在另一个数出现的位置j之前,而且满足ai>aj.那么满足这个偏序关系的链就叫做链.关于链和反链:

链(chain)是一个偏序集S的全序子集(所谓全序是指任意两个元素可比较)

反链(antichain)是一个偏序集S的子集,其中任意两个元素不可比较.

dilworth说的是:最大链的长度等于最少反链覆盖数.而最大反链的长度等于最少链覆盖数.

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int n;
int mp[100005];
int d1[100005],d2[100005];
int main()
{
    n=1;
    while(cin>>mp[n]) n++;
    n--;
    for(int i=1;i<=n;i++)
    {
        d1[i]=1;
        d2[i]=1;
    }
    for(int i=2;i<=n;i++)
    {
        //d1[i]=1;
        for(int j=1;j<i;j++)
        {
            //d1[j]=1,d2[j]=1;
            if(mp[i]>mp[j]&&d1[i]<d1[j]+1)
            d1[i]=d1[j]+1;
            if(mp[i]<=mp[j]&&d2[i]<d2[j]+1)
            d2[i]=d2[j]+1;
        }
    }
    //cout<<d1[n]<<endl<<d2[n];
    int s1=0,s2=0;
    for(int i=1;i<=n;i++)
    {
        //cout<<mp[i]<<' ';
        s1=max(s1,d1[i]);
        s2=max(s2,d2[i]);
    }
    //cout<<n<<endl;
    cout<<s2<<endl<<s1;
    return 0;
}
posted @ 2022-06-06 20:35  lishangli  阅读(89)  评论(0)    收藏  举报