算法思想:由边界向内收缩,所有值在最小堆中维护。设最大的边界为D0,其最小值点为(x0,y0,L0),搜索L0向边界内的点(dx,dy,dL),同时将(x0,y0,L0)出队。
若dL >= L0,则将(dx,dy,dL)点入队。否则,答案+=L0 - dL,并将(dx,dy,L0)入队。这是一个递推的bfs过程,直到遍历所有点时算法结束。
证明:只要证明每次加上的值 (Ln - dL) 是这个点能盛的水量即可。
(1) 如果由P的周围的点围成的边界出发,使这个边界不断拓展直到最大,计边界的最小值为Ln.。则所求Lk = MAX(L1,L2......Ln),这个点能盛的水量为(Lk - dL)。
只要证明Ln = Lk即可
(2)反证法:在(1)中边界不断扩张直到Dn的过程中,假设存在某个边界最小值Li > Ln。
但由于所求点在Dn的最小值点附近,有Li = min(D,Ln) ,D表示新的边界中除了Ln以外的点
即Ln >= Li,假设不成立,即Ln = Lk。
证明完成。