TLS 9.2C
这个题目我觉得我做的\(50\)分做法比\(100\)分的\(SBDP\)更具有价值.
因为这个\(DP\)真的很简单.
令\(f_{i,j}\)表示以\((i,j)\)为右下角的最大正方形的边长.则有转移方程:
\[f_{i,j} = min ( f_{i-1,j-1} , f_{i-1,j} , f_{i,j-1} ) + 1\] 最后的答案就在所有的
\(f_{i,j}\)中取一个
\(max\)就行了.
\(Code:\)
#include #include #include #include #include #include #include #include #include #include #include
这是\(O(n^2)\)的\(DP\)做法.
我接下里要说的这个\(O(n^3)\)的暴力做法其实是非常优美的.
它其实是悬线法求极大正方形的基础,这里我只维护了一个向右的最远扩展距离.
这个数组可以\(O(n^3)\)预处理,但其实可以做到\(O(n^2)\),从最右边向左递推就可以做到\(O(n^2)\).
这样借助这个数组,我们就可以枚举这个极大正方形的左右边界,然后从上向下去枚举,保证必须要连续一段都大于等于这个枚举出来的边长(枚举左右边界就知道了边长),每次遇到合法的就取\(max\)就可以了.
\(Code:\)
#include #include #include #include #include #include #include #include #include #include #include