1. 程式人生 > >洛谷P1736 吃魚

洛谷P1736 吃魚

長度 我們 -1 == 方便 min 一行 快速 思路

****灰常機智****

DP。說一說思路。

先考慮左上到右下的對角線:f[i][j]表示以(i,j)這一點作為右下角的合法正方形的最大長度。如果當前位置的數字為1,那麽考慮轉移:

  • 如果a[i-1][j-1]是0,那麽f[i][j]就是1;

  • 如果a[i-1][j-1]是1,那麽f[i][j]=min{f[i-1][j-1]+1,(i,j)左邊的最長連續0的長度,(i,j)上面最長連續0的長度}。

那麽問題來了,怎麽快速求最長連續0的長度呢,這個預處理好就可以了。

為了方便,我們預處理的時候,x[i][j]表示,(i,j)左邊最長連續0的長度(包含(i,j)),y[i][j]同理表示上面。如果a[i][j]==1,直接把x[i][j]和y[i][j]設為0,否則就x[i][j]=x[i][j-1]+1,y[i][j]=y[i-1][j]+1。這樣的話DP轉移方程應該是f[i][j]=min(f[i-1][j-1]+1, x[i][j-1]+1, y[i-1][j]+1)。

如果是右上到左下的對角線,就只要把每一行的數左右反轉一下,再做同樣的DP即可。

洛谷P1736 吃魚