题意:给出一列数,在这个序列里面找到一个连续的严格上升的子串,现在可以任意修改序列里面的一个数,问得到的子串最长是多少
看的题解,自己没有想出来
假设修改的是a[i],那么有三种情况,
1.a[i]>a[i-1],那么求出向左能够延伸的最长的长度
2.a[i]<a[i-1],那么求出向右能够延伸的最长的长度
3.如果修改的这个数刚好夹在两个数的中间,这种情况比上面两种都优, 即为a[i-1]<a[i+1]-1,求出左右能够延伸的最长的长度
然后因为a[i]本身还没有算进去,所以求出最大值后,再加个1 参看的这一篇http://blog.csdn.net/hongrock/article/details/37754307
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = (1<<30)-1; 15 const int mod=1000000007; 16 const int maxn=100005; 17 int a[maxn],l[maxn],r[maxn]; 18 19 int main(){ 20 int n; 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 23 for(int i=1;i<=n;i++) { 24 l[i]=1;r[i]=1; 25 } 26 27 for(int i=n-1;i>=1;i--) if(a[i]<a[i+1]) r[i]+=r[i+1]; 28 29 int ans=1; 30 for(int i=2;i<=n;i++) if(a[i]>a[i-1]) l[i]+=l[i-1]; 31 32 l[0]=-1;r[n+1]=-1; 33 a[0]=INF;a[n+1]=-1; 34 for(int i=1;i<=n;i++){ 35 if(a[i-1]<a[i+1]-1) ans=max(ans,l[i-1]+r[i+1]+1); 36 else ans=max(ans,max(l[i-1],r[i+1])+1); 37 } 38 printf("%d\n",ans); 39 return 0; 40 }
时间: 2024-10-24 01:51:13