将每一列表示为一个 位二进制掩码,其中位 表示白色,位 表示蓝色。
首先,仅保留不存在纵向连续三个相同位的列掩码。设这些掩码组成集合 ,其大小为 。由于 ,有 。每列选用的掩码还必须与该列所有已涂色的格子相符。
判断横向条件时,只需记住最近两列。设 表示已处理部分的最后两列掩码分别为 的合法方案数。添加新列掩码 时,要求每一行对应的 三个位不全相同。满足条件时,把 加到 中。所有结果都对 取模。
如果 ,直接统计第一列允许的掩码数。否则,用前两列所有允许的掩码对初始化 DP,再依次处理后面的列,最终将全部状态相加。
生成纵向合法掩码需要 时间,检查与预先涂色格子的一致性需要 时间,DP 需要 时间。预处理转移时空间复杂度为 。每次加法只会相加两个已经取模的数,因此不会超出有符号32位整数范围。