n∗m的字符矩阵,判断有多少个相同字符斜正方形。

解题思路:我们首先不管别的,对于每一个字符,它都能组成只有一个相同字符的斜正方形。那么其余的就是多种相同字符组合在一起形成的斜正方形了,怎么组合呢?我们不难发现。

仔细看这张图,在第一个图形中,若要构成这样的斜正方形,那么最下面的那个点一定要可以往上延伸。即判断当前位置[i][j]与上面四个位置([i-1][j]、[i-1][j-1]、[i-1][j+1]、[i-2][j])能否形成“斜正方形”,那么我们再看第二张图,从最下面那个点开始往上延伸,我们发现这些是有规律的,即是一个动态规划的过程,若我们设最下面那个点的方案数为dp[i][j],那么这个值本身就有一个1,就是自己单独形成一个字符,那么还有呢?就是可以和上面四个字符形成一个斜正方形或者更大,那么我只要它们字符都相等,不就满足了吗?那怎么写动态规划方程呢?我们就要知道这个点的方案数由哪几个点维护?就是由[i-1][j-1]、[i-1][j+1]、[i-2][j]这三个点维护,那你可能就会问呢?组合不是与四个点组合吗?为什么只要考虑三个点,因为不管怎样,在那三个点的维护下,最中间那个点已经被维护了,若三个点向上延伸也能组成一个斜正方形,那么你画一下图,最中间那个点根本不用考虑。所以我们就可以写出动态转移方程了,既然是由三个点维护,那肯定是要取三个点的最小值的。故: