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

来源:互联网 发布:java web实时进度条 编辑:程序博客网 时间:2024/05/22 17:05

从两个方向进行预处理,然后枚举出最大值(改子序列中的一个 或者不改两种情况)。

#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;}


0 0
原创粉丝点击