CF1051D题解

觉得巨佬们考虑的太复杂了,其实可以用三维递归 (一维表示第几列,二维记录有多少个连通块,三维两个格子同色或异色),对于第 i 格,连通块的数量取决于第 i-1 个格子,如下图。

字丑勿喷

然后可得递归式:


f[i][j][0] = (f[i - 1][j][1] \times 2 + f[i - 1][j][0] + f[i - 1][j - 1][0]);

f[i][j][1] = (f[i - 1][j - 1][0] \times 2 + f[i - 1][j][1] + f[i - 1][j - 2][1]);


最后附上代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int Maxn = 1005, mod = 998244353;
 4 int f[Maxn][Maxn * 2][2], n, k;//注意二维开两倍
 5 int main() {
 6   cin >> n >> k;
 7   f[1][2][0] = f[1][3][1] = 2;//初始化
 8   for (int i = 2; i <= n; i++) {
 9     for (int j = 2; j <= k + 1; j++) {//注意这里要加1
10       f[i][j][0] = (f[i - 1][j][1] * 2LL + f[i - 1][j][0] + f[i - 1][j - 1][0]) % mod;
11       f[i][j][1] = (f[i - 1][j - 1][0] * 2LL + f[i - 1][j][1] + f[i - 1][j - 2][1]) % mod;
12     }
13   }
14   cout << (f[n][k + 1][0] + f[n][k + 1][1]) % mod;
15   return 0;//华丽的结束
16 }
Code
posted @ 2023-09-09 10:40  mouse_boy  阅读(6)  评论(0编辑  收藏  举报