【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;
}
posted @ 2018-12-07 16:42  shellpicker  阅读(348)  评论(0编辑  收藏  举报