您的位置:首页 > 产品设计 > UI/UE

Codeforces Round #FF (Div. 2)C. DZY Loves Sequences

2014-08-07 13:46 344 查看
从两个方向进行预处理,然后枚举出最大值(改子序列中的一个 或者不改两种情况)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <math.h>
#include <map>
#include <algorithm>

using namespace std;
const int maxn = 100005;
int dp1[maxn],dp2[maxn],num[maxn];

int main(){
int n;
while(~scanf("%d",&n)){
for(int i = 1;i <= n;i++)
scanf("%d",num+i);
memset(dp1, 0, sizeof(dp1));
memset(dp2, 0, sizeof(dp2));
for(int i = 1;i <= n;i++){//以i结尾的最长连续递增子序列
if(num[i] > num[i-1])
dp1[i] = dp1[i-1]+1;
else
dp1[i] = 1;
}
for(int i = n;i >= 1;i--){//以i开头的最长连续递增子序列
if(num[i] < num[i+1])
dp2[i] = dp2[i+1]+1;
else
dp2[i] = 1;
}
/*for(int i = 1;i <= n;i++)
printf("%d ",dp1[i]);
printf("\n");
for(int i = 1;i <= n;i++)
printf("%d ",dp2[i]);*/
int ans_max = 0;
for(int i = 1;i <= n;i++){//枚举
if(num[i+1] - num[i-1] >= 2){
int temp = dp1[i-1] + dp2[i+1] + 1;
ans_max = max(ans_max,temp);
}
ans_max = max(ans_max,max(dp1[i-1],dp2[i+1])+1);
}
printf("%d\n",ans_max);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: