【codevs1065】01字符串
题目大意:输出仅由 0 和 1 组成的长度为 N 的字符串个数,并且其中不能含有 3 个连续的相同子串。
题解:数据太水,正规解法应该是枚举后缀进行判断。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=31;
int n,s[maxn],ans;
void dfs(int cur){
if(cur==n+1){
++ans;
return;
}
for(int i=0;i<=1;i++){
s[cur]=i;
bool ok=1;
for(int j=1;3*j<=cur;j++){
bool flag=1;
for(int k=0;k<j;k++)
if(s[cur-k]^s[cur-j-k]||s[cur-j-k]^s[cur-2*j-k]||s[cur-k]^s[cur-2*j-k]){
flag=0;
break;
}
if(flag){
ok=0;
break;
}
}
if(ok)dfs(cur+1);
}
}
int main(){
scanf("%d",&n);
if(!n)return puts("0"),0;
dfs(1);
printf("%d\n",ans);
return 0;
}