EOJ2846-统计字符串个数

题目

在 0 和 1 组成的长度为 的字符串中,输出不包含 “101”子串的字符串的个数。

输入

本题有多组测试数据。每组测试数据占一行,含一个正整数 ,表示字符串的长度。n = -1 表示输入结束。

输出

对每组测试数据,在一行中输出表示不包含 “101”子串的字符串的个数。

思路

如果结尾为0,那么不包含101的有d[n-1]个
如果结尾为1,那么前n-1个中不包含101的同样是d[n-1]个,但是加上1之后有可能组成101的格式,要想组成这样的格式,倒数第二个必然是0,于是我们把所有倒数第二个为0的全都去掉,即d[n-2]。可是这样一定会有误伤,因为把001同样给去掉了,误伤的也就是倒数第三位是0的,再把它加回来,于是加上d[n-3]。

最终就是d[n] = 2*d[n-1] - d[n-2] + d[n-3]

代码

#include <iostream>
#include <algorithm>

using namespace std;

int main() {

    int strnum[21] = { 0,2,4,7 };
    for (int i = 4; i < 21; i++)
        strnum[i] = strnum[i - 1] * 2 - strnum[i - 2] + strnum[i - 3];
    int n;
    cin >> n;
    while (n != -1) {
        cout << strnum[n] << endl;
        cin >> n;
    }
    
    return 0;
}

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页