【题意】:给一块n*2的巧克力,问分成k块的方案数有多少种。

【题解】:多校联赛第一场的b,想了2个小时,途中出现MLE,TLE,最后还是AC了。
              设状态dp[i][j][0-7]表示处理完第i列已经分成j块且第i列的分割线状态为0-7的方案数。
              0:空 1:─  2:┐ 3:┘ 4:│ 5:┤ 6:| 7:| 
              转移即是延长或终止上一列的分割线或加入新的分割线,具体看代码。

【代码】:
 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