![](https://images2015.cnblogs.com/blog/829161/201605/829161-20160504075119935-1221464920.png)
这是一个符合斐波纳契数列的dp问题,动态转移方程:dp[i]=dp[i-1]+dp[i-2];
解释:长度为i的01串组成:长度为i-1的串末尾的0的个数*2+长度为i-1的串末尾的1的个数*1,而长度为i-1的末尾的0的个数等于长度为i-2的串的个数,等量替换以后就是上面的转移方程。
1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<limits.h>
6 #include<algorithm>
7 #include<queue>
8 #include<vector>
9 #include<set>
10 #include<stack>
11 #include<string>
12 #include<sstream>
13 #include<map>
14 #include<cctype>
15 using namespace std;
16 int main()
17 {
18 int t,dp[45],n;
19 scanf("%d",&t);
20 dp[2]=3,dp[3]=5;
21 for(int i=4;i<=40;i++)
22 dp[i]=dp[i-1]+dp[i-2];
23 while(t--)
24 {
25 scanf("%d",&n);
26 printf("%d
",dp[n]);
27 }
28 return 0;
29 }