题目
在 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;
}