一个动态规划问题。
可以设 d p i , j dp_{i,j} dpi,j为以第 i i i个数为结尾删掉 j j j个数的最长连续上升子序列的长度。
设给定序列为 a a a。
转移:
-
j = 0 j=0 j=0且 a i > a i − 1 a_i>a_{i-1} ai>ai−1时, d p i , j = d p i − 1 , j + 1 dp_{i,j}=dp_{i-1,j}+1 dpi,j=dpi−1,j+1
-
j = 0 j=0 j=0且 a i ≤ a i − 1 a_i\le a_{i-1} ai≤ai−1时, d p i , j = 1 dp_{i,j}=1 dpi,j=1
-
j = 1 j=1 j=1且 a i > a i − 1 a_i>a_{i-1} ai>ai−1时, d p i , j = d p i − 1 , j + 1 dp_{i,j}=dp_{i-1,j}+1 dpi,j=dpi−1,j+1
-
j = 1 j=1 j=1且 a i ≤ a i − 1 a_i\le a_{i-1} ai≤ai−1时, d p i , j = 1 dp_{i,j}=1 dpi,j=1
-
j = 1 j=1 j=1且 a i > a i − 2 a_i>a_{i-2} ai>ai−2时, d p i , j = max ( d p i , j , d p i − 2 , j − 1 + 1 ) dp_{i,j}=\max(dp_{i,j},dp_{i-2,j-1}+1) dpi,j=max(dpi,j,dpi−2,j−1+1)
由于对于每个 i i i,下标要处理到 i − 2 i-2 i−2,方便起见给定序列为 a i ( 2 ≤ i ≤ n + 1 ) a_i(2\le i\le n+1) ai(2≤i≤n+1)。
上代码:
#include<stdio.h>
#include<iostream>
#define MAXN 200005
using namespace std;
int dp[MAXN][2],a[MAXN];
int ans;
int main()
{
int n;
scanf("%d",&n);
for(int i=2;i<=n+1;++i)
scanf("%d",a+i);
for(int i=2;i<=n+1;++i)
{
if(a[i]>a[i-1])
dp[i][0]=dp[i-1][0]+1;
else
dp[i][0]=1;
if(a[i]>a[i-1])
dp[i][1]=dp[i-1][1]+1;
else
dp[i][1]=1;
if(a[i]>a[i-2])
dp[i][1]=max(dp[i][1],dp[i-2][0]+1);
ans=max(ans,dp[i][0]);
ans=max(ans,dp[i][1]);
}
printf("%d",ans);
return 0;
}