Problem
题目描述
考虑下面的字母网格:
从字母网格读取的单词TARTU有7种方式:
给出字母网格中的一个单词,请你计算从字母网格的读取这个单词的方式个数。单词的第一个字母,可以从字母网格的任意单元格开始,下一个字母可从相邻单元(水平,垂直或对角线)读取。读单词时,一个单元格字母可多次读取。
输入格式:
第一行包含三个整数:$H(H≤200)$网格的高度,$W(W≤200)$网格的宽度,和$L(L≤100)$单词的最大长度。
下面的$H$行,每行$W$个字母描述网格。最后一行是长度为$L$单词。网格和单词都是大写的英文字母(A~Z)。
输出格式:
仅输出一个整数,你可以假设方案个数不超过${10}^{18}$。
样例输入输出:
1 | Input #1 |
1 | Output #1 |
1 | Input #2 |
1 | Output #2 |
Solution
搜索
首先想到的自然是搜索。
于是最劣运算次数约为:$200×8^{99}≈5.1×10^{91}$
暴搜挂着机,打表出省一
对于深搜最常用的两种优化:剪枝、记忆化。
好像这道题不能剪枝?那就用记忆化。
$f[x][y][depth]$记录当前坐标上的字母为第$depth$位时之后有多少种可行方案。
迭代模拟
由于当前一层的地图(即$f[][][depth]$)只受上一层地图(即$f[][][depth-1]$)的影响,因此可以考虑将递归转迭代。
$f[x][y][depth]$记录当前坐标上的字母为第$depth$位时有多少种可行方案。
可以发现$f[x][y][depth]$就是它周围$8$个方格里的$f[][][depth-1]$之和。
特殊情况:
$letter[x][y]≠word[depth]$,则$f[x][y][depth]=0$;
$depth=1且letter[x][y]=word[depth]$,则$f[x][y][depth]=1$。
1 |
|
当然写成滚动数组更好,但是本人太懒,外加数据范围不大,为了增加代码可读性,没有展示滚动数组的代码。
Data
链接:https://pan.baidu.com/s/1UUtmZlnT5NjhE_8nDr-Euw
提取码:grwc