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
原文地址:https://www.cnblogs.com/chujian123/p/3842024.html