导弹拦截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;
}