记录 HDU 1257 最少拦截系统

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. 

Input

输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔) 

Output

对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统. 

Sample Input

8 389 207 155 300 299 170 158 65

Sample Output

2

O(n^2)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=1e5+5;
int x[M],dp[M],n,m;
int lis()
{
    memset(dp,0,sizeof(dp));
    m=0;
    for(int i=1;i<=n;i++)
    {
        int a=0;
        for(int j=1;j<i;j++)
            if(dp[j]>a&&x[j]<x[i])
                a=dp[j];
        dp[i]=a+1;
        if(m<dp[i]) m=dp[i];
    }
    return m;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(x,0,sizeof(x));
        for(int i=1;i<=n;i++) scanf("%d",&x[i]);
        printf("%d\n",lis());
    }
    return 0;
}

O(nlogn)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=1e5+5;
int dp[M],x[M],y[M],z[M],n,m;
void erfen(int a,int b)
{
    int i=1,j=b,q;
    if(a<y[1]){ y[1]=a;return ;}
    while(1)
    {
        q=(i+j)/2;
        if(a>=y[q])
            i=q;
        else
            j=q;
        if(j-i==1&&y[i]<=a)
        {
            if(a>y[i]) y[j]=a;
            break;
        }
    }
}
int lis()
{
    memset(y,0,sizeof(y));
    memset(dp,0,sizeof(dp));
    m=0;
    y[++m]=x[1],dp[1]=1;
    for(int i=2; i<=n; i++)
    {
        if(x[i]>y[m])
            y[++m]=x[i];
        else if(x[i]==y[m]) continue;
        else
            erfen(x[i],m);
    }
    return m;
}

int main()
{

    int sum,d,c,e;
    while(scanf("%d",&n)!=EOF&&n)
    {
        memset(x,0,sizeof(x));
        for(int i=1; i<=n; i++)
            scanf("%d",&x[i]);
        printf("%d\n",lis());
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41081096/article/details/81540264