题目
给你一个长度为N的数组A,要求只能删除1个或者0个元素,使得原数组的最长连续上升子序列最长。
n < 1e5
题解思路
读了假题,一开始以为是最长上升子序列的模板题,结果是连续的,想太多了。
处理这样删除问题的经典处理方法,预处理出两边不变的部分(前缀后缀),再枚举要删除的数,求最值即可。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 200100;
int a[N] ;
int n ;
int dp1[N] ;
int dp2[N] ;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> n ;
for (int i = 1 ; i <= n ; i++ )
cin >> a[i] , dp1[i] = 1 , dp2[i] = 1 ;
for (int i = 2 ; i <= n ; i++ )
{
if ( a[i] > a[i-1] )
dp1[i] += dp1[i-1] ;
}
for (int i = n - 1 ; i >= 1 ; i-- )
{
if ( a[i] < a[i+1] )
dp2[i] += dp2[i+1] ;
}
int ans = 1 ;
for (int i = 1 ; i <= n ; i++ )
ans = max(ans,dp1[i]) ;
for (int i = 2 ; i <= n - 1 ; i++ )
{
if ( a[i-1] < a[i+1] )
ans = max(ans,dp1[i-1] + dp2[i+1] ) ;
}
cout << ans << "\n" ;
return 0 ;
}