题目链接:专题训练2-DP - Virtual Judge (vjudge.net)
思路:
运用LIS问题的解法可以求出一个系统拦截的最大导弹数,然后用Dilworth定理求出最少系统数。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long uu;
int dp[100500],q[100500],num[100500];
int n=0,a[100500],i=0,j=0,len=1,k,xn=1;
inline int finx(int x)//找到dp中第一个小于等于x的下标
{
int l=0,r=len-1,mid;
while(l<r)
{
mid=(l+r)>>1;
if(dp[mid]>=x)
l=mid+1;
else r=mid;
}
return l;
}
int main()
{
//freopen("input.txt","r",stdin);
while(cin>>a[i]) i++;
n=i;
len=1;
num[0]=a[0];
for(i=0; i<n; i++)
{
if(dp[len-1]>=a[i])
dp[len++]=a[i];
else
{
dp[finx(a[i])]=a[i];//LIS
}
k=lower_bound(num,num+xn,a[i])-num;//Dilworth
if(k==xn)
num[xn++]=a[i];
else
num[k]=a[i];
}
cout<<len<<endl<<xn;
}