预处理出每一个数字能够向后延伸多少,然后尝试将两段拼起来。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,a[110000],dp[110000]; int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",a+i); int nx=-1; for(int i=0;i<n;i++) { if(nx>i) { dp[i]=nx-i; continue; } int j=i; while(j+1<n&&a[j]<a[j+1]) j++; dp[i]=j-i+1; nx=max(nx,j+1); } int ans=dp[0]; for(int i=0;i<n;i++) { int p=dp[i]+i-1; if(p-1>=0&&p+1<n&&a[p+1]>a[p-1]+1) { ans=max(ans,dp[i]-1+dp[p+1]+1); } if(p+2<n&&a[p+2]>a[p]+1) { ans=max(ans,dp[i]+dp[p+2]+1); } if(p+1<n||i-1>=0) ans=max(ans,dp[i]+1); i=p; } printf("%d ",ans); return 0; }