动态规划。
思路:f(n)=f(n-1)+(f(n-1)-f(n-2)+f(n-3))。解释:长度为n的不含101的字串有2种可能:第一,长度为n-1的不含101的字串结尾+0;第二:长度为n-1的不含101的字串结尾+1。但第二种情况应除去结尾是101的字串。具体操作为减去结尾为01的字串再加上结尾为001的字串。
#include <iostream>
using namespace std;
int main()
{
int m, n[21]={0};
n[1]=2;
n[2]=4;
n[3]=7;
for(int i=4; i<21; i++) n[i]=2*n[i-1]-n[i-2]+n[i-3];
cin>>m;
while(m+1){cout<<n[m]<<endl;cin>>m;}
return 0;
}
为什么不直接减去结尾为101的子串呢
因为,如果用f(n-3)表示长度为n-3不含101的字符串。f(n-3)里包括末尾是“10”的情况,它并不在f(n-1)里,不能用它直接减。
感谢讲解