AcWing 3706. 不连续1的子串--dfs
原题链接
简单
作者:
小糖人乌兹
,
2023-03-19 12:56:32
,
所有人可见
,
阅读 23
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 22;
int n,sum; //sum记录答案
int a[2]={0,1};
bool st[N]; //st[i]=true代表第i位数是1,否则不是1
void dfs(int u){
if(u==n){ //dfs到终点,答案++
sum++;
return;
}
for(int i=0;i<2;i++){ //依次判断第u位选0还是1
if(u==0){ //特判第0位
if(i==1){ //是1就直接选
st[u]=true; //标记该位为1
dfs(u+1); //递归下一位
st[u]=false; //回溯
}
else dfs(u+1); //是0就直接选并递归下一位
}
else if(i==1){ //不是第0位且判断是否选1
if(!st[u-1]){ //若前一位不是1则当前位可以为1
st[u]=true;
dfs(u+1);
st[u]=false;
}
}
else dfs(u+1); //是0就直接选
}
}
int main(){
cin>>n;
dfs(0); //从第0位开始递归
cout<<sum;
return 0;
}