牛牛的数列(动态规划)

news/2024/6/16 7:24:13 标签: 动态规划, 算法

题目描述

牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。

输入描述:

输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 10^5),即数列的长度;
第二行n个整数a_i, 表示数列中的每个数(1 ≤ a_i ≤ 10^9),以空格分割。

输出描述:

输出一个整数,表示最长的长度。

示例1

输入

6

7 2 3 1 5 6

输出

5

如果只过90%的数据,可以试一下样例二

示例2

输入

4

1 2 3 1

输出

4

学习新方法

预处理两个数组,分别存储以第i个数结尾的连续上升子序列的长度和以第i个数为开头的连续上升子序列的长度

如果第i+1个数比第i-1个数大2及2以上,则第i个数可以通过改变其值的大小来使其连接

********

注:

序列的长度未到n之前,都可以通过改变一个值来使其长度加一

#include <iostream>

using namespace std;
int n;
const int N=1e5+10;
int h[N];
int dp1[N],dp2[N];
int dp[N];
int main ()
{
    cin>>n;
    for(int i=1;i<=n;i++)    scanf("%d",&h[i]);
    
    for(int i=1;i<=n;i++)
    {
        if(h[i]>h[i-1])    dp1[i]=dp1[i-1]+1;
        else 
        {
            dp1[i]=1;
        }
    }
    
    for(int i=n;i>=1;i--)
    {
        if(h[i]<h[i+1])    dp2[i]=dp2[i+1]+1;
        else 
        {
            dp2[i]=1;
        }
    }
    int ans=-1;
    for(int i=1;i<=n;i++)
    {
        if(h[i+1]>=h[i-1]+2)
        {
            //讨论连接dp1[i-1]和dp2[i+1]时,第i个数是否需要改变
            if(h[i]>h[i-1]&&h[i]<h[i+1])
            {
                ans=max(ans,dp1[i-1]+dp2[i+1]+2);
            }
            else 
            {
                ans=max(ans,dp1[i-1]+dp2[i+1]+1);
            }
        }
    }
    cout<<ans;
    return 0;
}

 来源:牛客网
登录—专业IT笔试面试备考平台_牛客网


http://www.niftyadmin.cn/n/1570012.html

相关文章

由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_剑指 Offer 07. 重建二叉树 leetcode 剑指offer系列...

题目难度: 中等原题链接[1]今天继续更新剑指 offer 系列, 这道题应该是树里面相当经典且质量很高的一道题目了, 也有递归和迭代两种做法: 递归方法比较直观易懂; 迭代方法可能难度较大, 属于进阶内容, 大家感兴趣的话可以自己结合画图模拟来思考若无意外, 每天晚上 6 点 45 分准…

2022ICPC网络预选赛补题

B Non-decreasing Array You are given a non-decreasing array of integers a1​,a2​,…,an​. In one operation, when the current length of the array is m: Firstly you can choose an index i(1<i<m) and delete ai​ (m decrease 1) or you can do nothing,Se…

地图点随机分布均匀_爬取一定范围内的地图兴趣点并生成地点分布图

愉快的开始此前我们做过相关的教程&#xff0c;就是利用Python调用百度地图的API接口获取相关的地图信息。比如爬取某个范围内特定的兴趣点的坐标&#xff0c;对两点之间进行路径规划计算行车时间等。相关的链接关注公众号【程序猿声】进行查看。用Python是可以获取到相关的数据…

分组背包

分组背包&#xff1a; 分组的背包问题将彼此互斥的若干物品称为一个组&#xff0c;这建立了一个很好的模型。不少背包问题的变形都可以转化为分组的背包问题&#xff0c;由分组的背包问题进一步可定义“泛化物品”的概念&#xff0c;十分有利于解题。 第 i 个物品是一个物品组&…

python莱布尼茨法计算π_python圆周率计算(带进度条)

3.波尔文四次迭代式这个公式由乔纳森波尔文和彼得波尔文于1985年发表的。bailey-borwein-plouffe算法这个公式简称BBP公式&#xff0c;由David Bailey, Peter Borwein和Simon Plouffe于1995年共同发表。它打破了传统的圆周率的算法&#xff0c;可以计算圆周率的任意第n位&#…

树形DP+状态机

一、战略游戏 鲍勃喜欢玩电脑游戏&#xff0c;特别是战略游戏&#xff0c;但有时他找不到解决问题的方法&#xff0c;这让他很伤心。 现在他有以下问题。他必须保护一座中世纪城市&#xff0c;这条城市的道路构成了一棵树。每个节点上的士兵可以观察到所有和这个点相连的边。…

lisp实心圆点怎么画_全网首发,用matplotlib画太极图

从古代的“三百六十行&#xff0c;行行出状元”到现如今的三万六千行&#xff0c;各行各业都有自己供奉的祖师爷&#xff0c; “天下百工圣人作”说的就是如此。比如&#xff0c;卖鞋的拜刘备&#xff0c;搞木工的拜鲁班&#xff0c;当老师的拜孔子&#xff0c;跑江湖的拜关二爷…

增减序列 (差分前缀和+贪心)

前缀和差分 a[N]是b[N]的前缀和数组&#xff0c;b[N]是a[N]的差分数组 b[1]a[1] a[i]b[1]b[2]b[i] a[1]a[2]-a[1]a[3]-a[2]a[i]-a[i-1] a[i] b[i]a[i]-a[i-1] 例题 给定一个长度为 n 的数列 a1,a2,…,an&#xff0c;每次可以选择一个区间 […