【题解】最长下降子序列

题意

给你一个字符串,你可以在其中翻转一个区间,然后求该序列中最长的非降子序列的长度。

题解

由于这里只有两个数,并且求的是子序列。先考虑组成的非降子序列是什么形式的,有三种形式,即都是或先或都是三种。那么在考虑存在翻转时怎么样翻转能够使得贡献最大。实际上这情况下,我们将中间的进行翻转能使答案的贡献最大,这个时候整体的长度和这种形式的长度是一致的。那么我们需要记录,,,四种情况下出现的最多值即可。

复杂度

时间复杂度

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
char str[N];
int main()
{
    scanf("%s",str);
    int n=strlen(str);
    int a=0,ab=0,aba=0,abab=0;
    for(int i=0; i<n; i++)
    {
        if(str[i]=='1')
            a++,aba++;
        else
            ab++,abab++;
        ab=max(ab,a);
        aba=max(aba,ab);
        abab=max(abab,aba);
    }
    printf("%d\n",abab);
    return 0;
}
全部评论

相关推荐

07-02 10:44
门头沟学院 C++
码农索隆:太实诚了,告诉hr,你能实习至少6个月
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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