zoukankan      html  css  js  c++  java
  • DZY Loves Sequences

    CF255 Div2 C:http://codeforces.com/contest/447/problem/C

    题意:给你一个序列,你可以改变其中一个数,然后让你求最长的连续上升子序列。

    题解:一开始的想法就是 处理出以i结尾和以i开头的最长的串的长度,然后枚举i。然而,自己就这样打了一发,结果wa。以为自己题目读错了,最后放弃了。第二天早上在看的时候,发现自己枚举的时候只考虑了改变一个数的情况,还有可能这个最长串是不能改变的,少了一个ans=max(ans,max(dp2[i],dp1[i])),有点后悔。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using  namespace std;
     6 int a[100006];
     7 int dp1[100006],dp2[100006];
     8 int n;
     9 int main(){
    10    while(~scanf("%d",&n)){
    11         memset(dp1,0,sizeof(dp1));
    12         memset(dp2,0,sizeof(dp2));
    13         memset(a,0,sizeof(a));
    14        for(int i=1;i<=n;i++)
    15            scanf("%d",&a[i]);
    16            int maxn=1;
    17            dp1[1]=1;
    18         for(int i=2;i<=n;i++){//处理以i结尾
    19             if(a[i]>a[i-1])maxn++;
    20             else maxn=1;
    21             dp1[i]=maxn;
    22         }
    23         maxn=1;
    24         dp2[n]=1;
    25        for(int i=n-1;i>=1;i--){//处理以i开头
    26             if(a[i]<a[i+1])maxn++;
    27             else maxn=1;
    28             dp2[i]=maxn;
    29        }
    30         int ans=0;
    31        for(int i=1;i<=n;i++){//枚举
    32            if(i==1) ans=max(ans,dp2[i]);
    33            else if(i==n)ans=max(ans,dp1[i]);
    34            else if(a[i+1]-a[i-1]>1)ans=max(ans,dp1[i-1]+dp2[i+1]);
    35            else ans=max(ans,max(dp1[i],dp2[i]));
    36        }
    37        if(ans<n)ans++;//如果没有达到n,那么可以改变一个数,把这个数放到队列中,所以要加1
    38        printf("%d
    ",ans);
    39    }
    40 }
    View Code
  • 相关阅读:
    pxc5.7配置安装
    在SQL中 给字符串补0方法
    python中字符串连接的四种方式
    python中math模块常用的方法整理
    python 字符串比较
    sql去重;同一条数据出现多条取一条的sql语句
    给一行添加数据库不存在的自然数顺序编号
    jvisualvm下载
    sql截取字符串后面四位
    idea破解更新
  • 原文地址:https://www.cnblogs.com/chujian123/p/3842024.html
Copyright © 2011-2022 走看看