【題意】:給一塊n*2的巧克力,問分成k塊的方案數(shù)有多少種。

【題解】:多校聯(lián)賽第一場的b,想了2個小時,途中出現(xiàn)MLE,TLE,最后還是AC了。
              設(shè)狀態(tài)dp[i][j][0-7]表示處理完第i列已經(jīng)分成j塊且第i列的分割線狀態(tài)為0-7的方案數(shù)。
              0:空 1:─  2:┐ 3:┘ 4:│ 5:┤ 6:| 7:| 
              轉(zhuǎn)移即是延長或終止上一列的分割線或加入新的分割線,具體看代碼。

【代碼】:
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "algorithm"
 5 #include "vector"
 6 #include "queue"
 7 #include "cmath"
 8 #include "string"
 9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 #include "set"
13 #include "utility"
14 using namespace std;
15 typedef pair<intint> pii;
16 #define pb push_back
17 #define mp make_pair
18 #define fi first
19 #define se second
20 #define sof(x) sizeof(x)
21 #define lc(x) (x << 1)
22 #define rc(x) (x << 1 | 1)
23 #define lowbit(x) (x & (-x))
24 #define ll long long
25 const int MOD = 100000007;
26 int dp[2][2010][10];
27 int ans[1010][2010];
28 int n, m;
29 
30 void init() {
31     memset(dp, 0, sizeof(dp));
32     dp[0][0][4] = 1;
33     int p3 = 0, p2 = 1;
34     for(int i = 1; i <= 1000; i++) {
35         swap(p3, p2);
36         for(int j = 0; j <= (i << 1); j++)
37             for(int k = 0; k < 8; k++)
38                 dp[p3][j][k] = 0;
39         for(int j = 0; j <= (i << 1); j++) {
40             dp[p3][j][0] = (dp[p2][j][0] + dp[p2][j][2] + dp[p2][j][3] + dp[p2][j][4] + dp[p2][j][5]) % MOD;
41             dp[p3][j][1] = (dp[p2][j][1] + dp[p2][j][2] + dp[p2][j][3] + dp[p2][j][4] + dp[p2][j][5] + dp[p2][j][6] + dp[p2][j][7]) % MOD;
42             dp[p3][j][6] = dp[p3][j][7] = (dp[p2][j][0] + dp[p2][j][2] + dp[p2][j][3] + dp[p2][j][4] + dp[p2][j][5]) % MOD;
43       //      dp[p3][j][7] = (dp[p2][j][0] + dp[p2][j][2] + dp[p2][j][3] + dp[p2][j][4] + dp[p2][j][5]) % MOD;
44             if(j >= 1) {
45                 dp[p3][j][3] = dp[p3][j][2] = (dp[p2][j-1][1] + dp[p2][j-1][2] + dp[p2][j-1][3] + dp[p2][j-1][4] + dp[p2][j-1][5] + dp[p2][j-1][6] + dp[p2][j-1][7]) % MOD;
46         //        dp[p3][j][3] = (dp[p2][j-1][1] + dp[p2][j-1][2] + dp[p2][j-1][3] + dp[p2][j-1][4] + dp[p2][j-1][5] + dp[p2][j-1][6] + dp[p2][j-1][7]) % MOD;
47                 dp[p3][j][4] = (dp[p2][j-1][0] + dp[p2][j-1][2] + dp[p2][j-1][3] + dp[p2][j-1][4] + dp[p2][j-1][5]) % MOD;
48             }
49             if(j >= 2) dp[p3][j][5] = (dp[p2][j-2][1] + dp[p2][j-2][2] + dp[p2][j-2][3] + dp[p2][j-2][4] + dp[p2][j-2][5] + dp[p2][j-2][6] + dp[p2][j-2][7]) % MOD;
50             ans[i][j] = (dp[p3][j][4] + dp[p3][j][5]) % MOD;
51         } 
52     }
53 }
54 
55 int main() {
56     int T;
57     init();
58     scanf("%d", &T);
59     while(T--) {
60         scanf("%d%d", &n, &m);
61         printf("%d\n", ans[n][m]);
62     }
63     return 0;
64 }
65