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])),有点后悔。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n",ans); 39 } 40 }