牛牛的数列

牛牛的数列

https://ac.nowcoder.com/acm/problem/13134

连续的子序列,emmm,难度瞬间下降...
只要预处理出来两个数组,第一个是到i的时候,前面递增的最大数量,第二个是从后面往前递减的最大数量,然后假如a[i+1]-a[i-1]>2即可统计答案..
代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],l[N],r[N];//左边有多少连续比它小的 右边有多少连续比它大的
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);
    int cnt=0;int ans=1;
    for(int i=1;i<=n;i++)
    {
        if(a[i]>a[i-1])
        {
            cnt++;
            l[i]=cnt;
            if(i!=n) ans=max(ans,l[i]+1);
            else     ans=max(ans,l[i]);
        }
        else l[i]=1,cnt=1;
    }cnt=0;
   // for(int i=1;i<=n;i++) cout<<l[i]<<' ';
   // cout<<endl;
    for(int i=n;i>=1;i--)
    {
        if(a[i+1]>a[i])
        {
            cnt++;
            r[i]=cnt;
            if(i!=1) ans=max(ans,r[i]+1);
            else     ans=max(ans,r[i]);
        }
        else r[i]=1,cnt=1;
    }
   // for(int i=n;i>=1;i--) cout<<r[i]<<' ';
   // cout<<endl;
    for(int i=1;i<=n;i++)
    {
       if(a[i+1]-a[i-1]>1) ans=max(ans,l[i-1]+r[i+1]+1);
    }
    cout<<ans<<endl;
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论
总感觉题目不对啊,这样做万一是单边的连续不就没+1了,比如数据是6 2 3 2 3 4 5出来是4,其实是5啊(把第二个数从3变1)
2 回复 分享
发布于 2020-09-10 08:42
这道题用单调栈、双指针是最好想的方法,但是个人还是比较喜欢 $dp$。 考虑一下最长连续下降子序列的 $dp$ 方程: $$ l_i=\begin{cases} 1, & i=1 \\ l_{i-1}+1,& a_i>a_{i-1} \\ 1,& a_i\le a_{i-1} \end{cases} $$ 我们只需要将 $a_i>a_{i-1}$ 换成 $a_i<a_>1$ 的位置,转移方程就变成了: $$ f_i=l_{i-1}+r_{i+1}+1 $$ 最后用 $ans$ 记录一下即可。 时间复杂度 $O(n)$。</a_>
点赞 回复 分享
发布于 2023-04-12 23:03 广东
orz
点赞 回复 分享
发布于 2023-03-22 18:32 山东
用l[]数组完成不就行了吗
点赞 回复 分享
发布于 2020-09-09 17:41

相关推荐

10-01 09:50
门头沟学院 Java
肖先生~:这个人真的很好,点赞
点赞 评论 收藏
分享
评论
22
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务