【題意】:給出一個長度為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 }