hdu 1257 导弹拦截系统 最长递增子序列模板题

 

题意不在赘述。

 

在处理这个问题之前需要知道一个性质就是求一组数的连续递减子序列个数,相当于求这整组数的最长递增子序列长度

于是就直接套模板就好;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int dp[100000];    //  dp[i]表示到第i个数的最长递增子序列长度
int mis[100000];

void ini()
{
    memset(dp,0,sizeof(dp));
}

int main()
{
    int n;
    int minm=100000;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&mis[i]);
            if(minm>mis[i]) minm=mis[i];
        }
        dp[0]=minm;//先把mis数组中的最小值放入dp[0]为了避免整体为递减的情况,也方便于后续的储存,毕竟dp数组末尾的数越小,越容易产生更长的最长递增子序列
        int cnt=1;
        for(int i=0;i<n;i++ )//这里运用了二分来给dp数组填值,切记这个dp数组的内容是错误的,只是用来求解长度,里面的数据为假,不可使用;
        {//模板开始;
            int res=lower_bound(dp,dp+cnt,mis[i])-dp;
            if(mis[i]>dp[cnt-1]) dp[cnt++]=mis[i];
            else dp[res]=mis[i];
        }//模板结束;
        printf("%d\n",cnt-1);
    }
    return  0;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/81544393
今日推荐