【题意】:给一块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<int, int> 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