【题目描述】
输出仅有0和1组成的长度为n的字符串,并且其中不能含有3个连续的相同子串。
【输入描述】
输入文件只有一行一个整数n,表示有0和1组成的字符串的长度。0 <= n <= 30。
【输出描述】
输出文件只有一行一个整数,表示所有满足条件的字符串的个数。
【样例输入】
1
【样例输出】
2
递推DP:
源代码: #include<cstdio> int n,f[31]; int main() { scanf("%d",&n); f[1]=2; f[2]=4; for (int a=3;a<=n;a++) f[a]=f[a-1]+f[a-2]; //后两位无非有两种情况:相同,不相同。若相同则无非为[1][1]或[2][2],则前面的排列方案无非为结尾为1的f[i-2]或结尾为2的f[i-2],总共为f[i-2]。若不同则无非结尾为[1]或[2],同理于上,总共为f[i-1]。也可看为Fabonacci数列的2倍数。 printf("%d",f[n]); return 0; }
深度优先搜索:
源代码: #include<cstdio> int n,ans(0); void Solve(int Length,int Last,int Time) //普通的DFS。 { if (Length==n) //完毕。 { ans++; return; } if (Time==1) //第一次出现。 Solve(Length+1,Last,2); Solve(Length+1,1-Last,1); } int main() { scanf("%d",&n); if (n) //避免0的情况。 { Solve(1,1,1); Solve(1,0,1); } printf("%d",ans); return 0; }