zoukankan      html  css  js  c++  java
  • Codeforces Round #FF (Div. 1) A. DZY Loves Sequences 动态规划

    A. DZY Loves Sequences

    题目连接:

    http://www.codeforces.com/contest/446/problem/A

    Description

    DZY has a sequence a, consisting of n integers.

    We'll call a sequence ai, ai + 1, ..., aj (1 ≤ i ≤ j ≤ n) a subsegment of the sequence a. The value (j - i + 1) denotes the length of the subsegment.

    Your task is to find the longest subsegment of a, such that it is possible to change at most one number (change one number to any integer you want) from the subsegment to make the subsegment strictly increasing.

    You only need to output the length of the subsegment you find.

    Input

    The first line contains integer n (1 ≤ n ≤ 105). The next line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109).

    Output

    In a single line print the answer to the problem — the maximum length of the required subsegment.

    Sample Input

    6
    7 2 3 1 5 6

    Sample Output

    5

    Hint

    题意

    让你找到一个区间,你可以改变这个区间的一个数,然后使得这个区间是严格上升的

    且这个区间一定是最长的,输出区间长度

    题解:

    dp1[i]表示从左边开始的最长上升子串,dp2[i]是右边开始的最长上升子串

    然后我们枚举i,那么答案就显然是在a[i-1]<a[i+1]-1的情况下,ans=max(ans,dp1[i-1]+dp2[i+1]+1)这个玩意儿

    然后不停转移就好了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+7;
    int dp1[maxn],dp2[maxn],a[maxn];
    int main()
    {
        int n;
        scanf("%d",&n);a[0]=1e9+7,a[n+1]=1e9+7;
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        if(n==1)return puts("1"),0;
        if(n==2)return puts("2"),0;
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            dp1[i]=1;
            if(a[i]>a[i-1])dp1[i]=dp1[i-1]+1;
            ans=max(ans,dp1[i]);
        }
        for(int i=n;i>=1;i--)
        {
            dp2[i]=1;
            if(a[i]<a[i+1])dp2[i]=dp2[i+1]+1;
            ans=max(ans,dp2[i]);
        }
        for(int i=1;i<=n;i++)
        {
            if(a[i-1]<a[i+1]-1)
                ans=max(ans,dp1[i-1]+dp2[i+1]+1);
        }
        for(int i=2;i<=n;i++)ans=max(ans,dp2[i]+1);
        for(int i=1;i<n;i++)ans=max(ans,dp1[i]+1);
        cout<<ans<<endl;
    }
  • 相关阅读:
    MYSQL DDL语句
    Centos-610-Jenkins-CI系列开篇
    Centos610-FastDFS系列篇
    Oracle内存调整办法
    IIS网站安全控制
    在Docker里面安装oracle11R2
    在Centos7.*里面安装MSSQL
    在Docker上安装MSSQL
    Centos6.*安装新版Nginx1.19.5支持众多新功能
    Centos6.*同步系统时间
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5528277.html
Copyright © 2011-2022 走看看