另外一种理解方式。

分别记原题中的 H,W,NH, W, Nn,m,kn, m, k

先考虑判定:给你一个长为 2k2k 的串,判断是否能走出这个串。

考虑 DP:gp,i,jg_{p, i, j} 表示匹配了前 pp 个位置,是否能到达 (i,j)(i, j),状态数为 O(knm)O(knm),可以滚动数组变为 O(nm)O(nm)

考虑优化,因为每次可以在一行 / 一列内任意走动,所以只需要记录行 / 列。设 gp,ig_{p, i} 表示匹配了前 pp 个位置,能否走到第 ii 行 / 列(pp 为偶数时代表行,否则代表列),状态数为 O(k(n+m))O(k(n + m)),可以滚动数组变为 O(n+m)O(n + m)

回到原题,因为 n,mn, m 很小,所以可以直接将 gg 记入状态,做 DP 套 DP。即,设 fi,sf_{i, s} 表示匹配了前 ii 个位置且 gi=sg_i = s 的方案数。转移时枚举下一个字符是什么,并同时转移 gg

简单预处理即可做到 O(bk2max(n,m))O(bk2^{\max(n, m)}),此处字符集大小 b=9b = 9