1. 程式人生 > >【codevs1065】01字串

【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;
}