【题意】:给出一个长度为n的序列,要求用数字0或者1填补,要求每两个1都不能相邻,问有多少种填法?
【题解】:定义dp[i][0],表示已经填了 i 个数字,且最后的数字为0.
定义dp[i][1],表示已经填了 i 个数字,且最后的数字为1.
转移方程:
dp[i][0] = dp[i-1][0] + dp[i-1][1];
dp[i][1] = dp[i-1][0];
显然最后答案 ans = dp[n][0] + dp[n][1];
【代码】:
1 #include "iostream"
2 #include "cstdio"
3 #include "cstring"
4 using namespace std;
5 #define maxn 50
6 int dp[maxn][2];
7 int main() {
8 int T, n;
9 dp[1][0] = dp[1][1] = 1;
10 for(int i = 2; i < maxn; i++) {
11 dp[i][0] = dp[i-1][0] + dp[i-1][1];
12 dp[i][1] = dp[i-1][0];
13 }
14 scanf("%d", &T);
15 for(int t = 1; t <= T; t++) {
16 scanf("%d", &n);
17 int ans = dp[n][0] + dp[n][1];
18 printf("Scenario #%d:\n", t);
19 printf("%d\n\n", ans);
20 }
21 return 0;
22 }