这是一个符合斐波纳契数列的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\n",dp[n]); 27 } 28 return 0; 29 }