2018.06.29 NOIP模拟 1807(简单递推)

时间:2022-05-18 19:02:40

1807

题目背景

SOURCE:NOIP2015-SHY-2

题目描述

给出一个由数字(‘0’-‘9’)构成的字符串。我们说一个子序列是好的,如果他的每一位都是 1、8、0、7 ,并且这四个数字按照这种顺序出现,且每个数字都出现至少一次(111888888880000007 是好的,而 1087 不是)。请求出最大的好的子序列的长度。

输入格式

输入唯一一行一个字符串。

输出格式

一行一个整数表示答案。

样例数据 1

输入

1800777700088888000777

输出

13

备注

【数据范围】

对 30% 的输入数据 :字符串长度≤100 ;

对 100% 的输入数据 :字符串长度≤1000000 。

这道题是一道显然的递推,考试时数组开小了90" role="presentation" style="position: relative;">9090分gg" role="presentation" style="position: relative;">gggg.

代码如下:

#include<bits/stdc++.h>
using namespace std;
char s[1000005];
int n,cnt[5],f[5][1000005];
int main(){
    scanf("%s",s+1);
    n=strlen(s+1);
    for(int i=1;i<=n;++i)f[1][i]=f[1][i-1]+(s[i]=='1');
    for(int i=1;i<=n;++i){
        f[2][i]=f[2][i-1]+(s[i]=='8'&&f[2][i-1]);
        if(s[i]=='8'&&f[1][i-1])f[2][i]=max(f[2][i],f[1][i-1]+1);
    }
    for(int i=1;i<=n;++i){
        f[3][i]=f[3][i-1]+(s[i]=='0'&&f[3][i-1]);
        if(s[i]=='0'&&f[2][i-1])f[3][i]=max(f[3][i],f[2][i-1]+1);
    }
    for(int i=1;i<=n;++i){
        f[4][i]=f[4][i-1]+(s[i]=='7'&&f[4][i-1]);
        if(s[i]=='7'&&f[3][i-1])f[4][i]=max(f[4][i],f[3][i-1]+1);
    }
    printf("%d",f[4][n]);
    return 0;
}