第二题:创意吃鱼法
本题是经典的DP题,题目比较简单。
我们所要求的是一个对角线为1,其余地方都为0的子正方形,考虑到对角线实际上是有左上到右下和从右上到左下这两种方向的,不失一般性,首先考虑左上到右下的方向。记f[i,j]为子正方形的右下角坐标为(i,j)所能产生的最优对角线的长度,left[i,j]为(i,j)的左边有多少个连续的0,up(i,j)表示(i,j)的右边有多少个连续的0,这样状态转移是显然的:
f(i,j)=min{f(i-1,j-1),up(i,j),left(i,j)}+1 if(graph[i,j]==1)
f(i,j)=0 if(graph[i,j]==0)
up[i,j]和left[i,j]的计算方法同一维部分和序列的DP方法相似,在此不再赘述。同样对于对角线从右上到左下的方向也可以同样处理。
上述的算法时间复杂度和空间复杂度都是O(n^2),考虑到空间的限制,可以用滚动数组来解决MLE的问题,这同样是易于理解的。