nyoj252 01串

来源:互联网 发布:加特效的软件 编辑:程序博客网 时间:2024/05/16 18:55

01串

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个,他希望你能帮帮他。

注:01串的长度为2时,有3种:00,01,10。

输入
第一行有一个整数n(0<n<=100),表示有n组测试数据;
随后有n行,每行有一个整数m(2<=m<=40),表示01串的长度;
输出
输出不含有“11”子串的这种长度的01串共有多少个,占一行。
样例输入
223
样例输出
3

5

最开始看到题目就想到了用深搜,结果写完果断超时,最后用笔算了一下,才发现是斐波那契问题,坑坑哒!

下面贴上超时深搜代码

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int cnt = 0, num;char ans[50];void dfs(int sum){if(sum == num){if(strstr(ans, "11") == NULL)cnt++;return ;//好像这次又在这错了,导致无法递归结束,怎么才能长脑子啊我}ans[sum] = '1';//这里跟那个幸运三角形的深搜有点类似dfs(sum + 1);ans[sum] = '0';dfs(sum + 1);}int main(){int n;scanf("%d", &n);while(n--){cnt = 0;memset(ans, '0', sizeof(ans));scanf("%d", &num);dfs(0);printf("%d\n", cnt);}return 0;}
//下面是AC代码

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int main(){int n, num, i; scanf("%d", &n);int dp[50];dp[1] = 0;dp[2] = 3;dp[3] = 5;for(i = 4; i <= 40; i++)//我想这样预处理应该可以节约一部分时间{dp[i] = dp[i - 1] + dp[i - 2];}while(n--){scanf("%d", &num);printf("%d\n", dp[num]);}return 0;} 



0 0
原创粉丝点击