• 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
  • 相关阅读:
    ActiveX控件的注册和反注册
    谷歌浏览器调用activex控件方法
    VC 中的ATL ActiveX 和 MFC ActiveX 有什么区别
    DirectX介绍(转)
    最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)(转)
    统计Visual Studio项目的代码行数
    【Sqlite3】sqlite_sequence表(转)
    linuxunix系统下的字符操作
    tif
    字符串截取
  • 原文地址:https://www.cnblogs.com/chujian123/p/3842024.html
Copyright © 2020-2023  润新知