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串共有多少个,占一行。 样例输入
-
2 2 3
样例输出
-
3
5
-
-
最开始的思路是计算结尾0,1的字符串数,如果是0,则加二位,否则加一位。
-
#include <iostream> #include <deque> using namespace std; int main() { int x; cin>>x; while(x--) { deque<int> deq; deque<int>::iterator it; int n,count_0,count_1; cin>>n; for(int i=0;i<n;i++) { count_0=0; count_1=0; if(deq.empty()) { deq.push_front(0); deq.push_front(1); } else { for(it=deq.begin();it!=deq.end();it++) if(*it==0) count_0++; else count_1++; deq.clear(); for(int i=0;i<count_0;i++) { deq.push_front(0); deq.push_front(1); } for(int i=0;i<count_1;i++) { deq.push_front(0); } } } cout<<deq.size()<<endl; deq.clear(); } return 0; }
-
显然运行超时了....
-
-
然后想到用递归:
-
思路: 求长度为k的字符串中不含 ‘11’ 子串的字符串的个数dp[k],此时需要分两种情况: (1)当第 k 位为 0 时,不含 ‘11’子串的个数为dp[k - 1]; (2)当第 k 位为 1 时,第 k - 1 位一定为 0, 则此时不含 ‘11’子串的个数为dp[k - 2];
-
#include <iostream> #include <cstdio> using namespace std; int solve(int len) { if(len == 2) return 3; else if(len == 3) return 5; else return solve(len - 1) + solve(len - 2); } int main() { int T, len; scanf("%d", &T); while(T--) { scanf("%d", &len); printf("%d\n", solve(len)); } return 0; }
-
-
-
用一个数组保存运行结果:
-
#include <iostream> #include <cstdio> using namespace std; int dp[41]; void init() { dp[2] = 3; dp[3] = 5; for(int i = 4; i <= 40; ++i) dp[i] = dp[i - 1] + dp[i - 2]; } int main() { int T, len; init(); scanf("%d", &T); while(T--) { scanf("%d", &len); printf("%d\n", dp[len]); } return 0; }
AC.... -
动态规划...
-
-
第一行有一个整数n(0<n<=100),表示有n组测试数据;