题目:
https://www.nowcoder.com/questionTerminal/4e1012fe691b446d88eba5db8f511692
要求一个最长连续子序列,这个序列中只更改一个数字,便是最长连续递增子序列。
设更改的数字位于A[i],对A[i],计算出以A[i-1]为结尾的最长递增子序列,以A[i+1]为开始的最长子序列,再根据A[i-1] 与 A[i+1]的大小关系,确定更改A[i]时的最长连续递增子序列的长度。
#include <iostream> #include <algorithm> #include <stdio.h> using namespace std; const int maxn = 100000 + 5; const int INF = 0x3f3f3f3f; int data[maxn], n; int dp[maxn], dp1[maxn]; int main() { int n; scanf( "%d", &n ); for( int i = 0; i < n; i++ ) { scanf( "%d", data+i ); } //dp[i],以data[i]开始的最长上升子序列的长度 dp[ n -1 ] = 1; for( int i = n-2; i >= 0; i-- ) { if( data[i] < data[i+1] ) { dp[i] = dp[i+1] + 1; } else { dp[i] = 1; } } //dp1[i],以data[i]结尾的最长上升子序列的长度 dp1[ 0 ] = 1; for( int i = 1; i < n; i++ ) { if( data[i] > data[i-1] ) { dp1[i] = dp1[i-1] + 1; } else { dp1[i] = 1; } } int myMax = 1; int m = 1; for( int i = 0; i < n-1; i++ ) { if( i == 0 ) { m = dp[i+1] + 1; } else if( i == n-1 ) { m = dp1[i-1] + 1; } else if( data[i-1] + 1 < data[i+1] ) { m = dp[i+1] + dp1[i-1] + 1; } else { m = max( dp[i+1] + 1, dp1[i-1] + 1 ); } if( m > myMax ) { myMax = m; } } cout << myMax << endl; return 0; }