牛牛的数列 最长递增子序列

题目:

https://www.nowcoder.com/questionTerminal/4e1012fe691b446d88eba5db8f511692

要求一个最长连续子序列,这个序列中只更改一个数字,便是最长连续递增子序列。

设更改的数字位于A[i],对A[i],计算出以A[i-1]为结尾的最长递增子序列,以A[i+1]为开始的最长子序列,再根据A[i-1] 与 A[i+1]的大小关系,确定更改A[i]时的最长连续递增子序列的长度。

#include <iostream>
#include <algorithm>
#include <stdio.h>

using namespace std;

const int maxn = 100000 + 5;
const int INF = 0x3f3f3f3f;

int data[maxn], n;
int dp[maxn], dp1[maxn];
int main()
{
    int n;
    scanf( "%d", &n );
    for( int i = 0; i < n; i++ )
    {
        scanf( "%d", data+i );
    }


        //dp[i],以data[i]开始的最长上升子序列的长度
        dp[ n -1 ] = 1;

        for( int i = n-2; i >= 0; i-- )
        {
            if( data[i] < data[i+1] )
            {
                dp[i] = dp[i+1] + 1;
            }
            else
            {
                dp[i] = 1;
            }
        }

        //dp1[i],以data[i]结尾的最长上升子序列的长度
        dp1[ 0 ] = 1;
        for( int i = 1; i < n; i++ )
        {
            if( data[i] > data[i-1] )
            {
                dp1[i] = dp1[i-1] + 1;
            }
            else
            {
                dp1[i] = 1;
            }
        }

        int myMax = 1;
        int m = 1;
        for( int i = 0;  i < n-1; i++ )
        {
            if( i == 0 )
            {
                m = dp[i+1] + 1;
            }
            else if( i == n-1 )
            {
                m = dp1[i-1] + 1;
            }
            else if( data[i-1] + 1 < data[i+1] )
            {
                m = dp[i+1] + dp1[i-1] + 1;
            }
            else
            {
                m = max( dp[i+1] + 1, dp1[i-1] + 1 );
            }
            if( m > myMax )
            {
                myMax = m;
            }
        }
        cout << myMax << endl;

    return 0;
}
原文地址:https://www.cnblogs.com/wangzhiyi/p/6884280.html