UVa 1471 Defense Line 防线

来源:互联网 发布:linux文件内容复制 编辑:程序博客网 时间:2024/05/01 17:00

前面的博文有写过LIS O(nlogn)的做法,今天再复习一下。
戳这里->http://blog.csdn.net/x_1023/article/details/70259967

首先考虑一个潜能数组c的作用:
c[i]表示长度为i的最优上升子序列的末尾值(即末尾值的最小值,这样决策一定最优,因前面部分没有后效性)。
于是每次统计答案并更新c数组即可,以下为一个更方便写的板子,运用了lower_bound返回不小于值的特性和INF,写法更简洁:

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<algorithm>using namespace std;const int maxn=5005;int n,s[maxn],c[maxn];int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)        scanf("%d",s+i);    int len=0;    memset(c+1,0x3f,sizeof(int)*n);    for(int i=1;i<=n;i++)    {        int pos=lower_bound(c+1,c+n+1,s[i])-c;        c[pos]=s[i];    }    printf("%d",lower_bound(c+1,c+n+1,0x3f3f3f3f)-c-1);    return 0;}

考虑这道题,刘汝佳上的方法太过于麻烦,类似于一个单调队列的思想,不过是二维所以需要set胡搞。
简洁的做法可以利用LIS的思想。
首先扫两遍,计算出每个节点向前和向后能延伸的最大长度,然后将前节点的向前长度和后节点向后长度一拼。朴素做法是枚举两个节点,为O(n2)的复杂度。于是优化前节点的枚举,直接维护前节点长度对应的末位最小值,保证潜能最大。

枚举前后节点且枚举无后效性的题目用LIS思想有奇效。

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<algorithm>using namespace std;const int maxn=200005;int n,ans;int s[maxn],c[maxn],l[maxn],r[maxn];int main(){    int T;cin>>T;    while(T--)    {        ans=0;        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",s+i);        l[0]=r[n+1]=0;        for(int i=1;i<=n;i++)        {            if(s[i-1]<s[i])l[i]=l[i-1]+1;            else l[i]=1;        }        for(int i=n;i;i--)        {            if(s[i+1]>s[i])r[i]=r[i+1]+1;            else r[i]=1;        }        memset(c+1,0x3f,sizeof(int)*n);        for(int i=1;i<=n;i++)        {            int len=lower_bound(c+1,c+n+1,s[i])-c;            ans=max(ans,len-1+r[i]);            c[l[i]]=min(c[l[i]],s[i]);        }        printf("%d\n",ans);    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鱼身体里有线虫怎么办 幼猫半夜一直叫怎么办 猫半夜4点叫不停怎么办 眼睛里长了黄斑怎么办 眼睛周围长小疙瘩怎么办 眼睛被手机砸了怎么办 眼睛被东西砸了怎么办 眼睛被打了一下怎么办 眼睛被树枝伤了怎么办 眼球被打了一下怎么办 眼睛黄有血丝是怎么办 上眼皮有异物感怎么办 20岁眼周围皱纹怎么办 才22岁眼睛皱纹怎么办 眼周围发干皱纹怎么办 眼周围淤血肿了怎么办 每到秋季就咳嗽怎么办 左肾泥沙样结石怎么办 双肾泥沙样结石怎么办 温州市民卡丢了怎么办 上眼皮过敏肿了怎么办 上眼皮又痒又肿怎么办 上眼皮红肿痛是怎么办 上眼皮肿的厉害怎么办 眼皮肿了还痒痒怎么办 眼睛被手指戳到怎么办 打球眼睛撞肿了怎么办 打球时眼睛被戳怎么办 狗眼睛被打充血怎么办 一只眼睛磨的慌怎么办 5个月宝宝结膜炎怎么办 金毛眼屎多白色怎么办 金毛眼红有眼屎怎么办 狗狗眼睛上火了怎么办 狗上火了眼屎多怎么办 金毛走路扭腰怎么办 金毛流鼻涕微黄怎么办 狗狗下眼皮红了怎么办 金毛眼睛打肿了怎么办 金毛的眼睛红怎么办 眼睛干涩有红血丝怎么办