f(y1,x1,y2,x2):= 矩形[y1,y2)×[x1,x2)の複雑度
とすれば自明な漸化式が導けるが、時間的にも空間的にも間に合っていない。そこで、次の点に注目する:
- 複雑度は高々⌈log2(HW)⌉=16と小さい
- x2やy2が増加すると複雑度は単調に増加する
したがって、ナップサックDPのように値と変数を入れ替えたDPができる。具体的には
f(y1,x1,y2,c):= [y1,y2)×[x1,X)の複雑度がc以下になるような最大のX
g(y1,x1,x2,c):= [y1,Y)×[x1,x2)の複雑度がc以下になるような最大のY
としてDPする。f(y1,x1,y2,c)の漸化式を与える。左右に分割する場合に限ったXの最大値は、複雑度c−1以下の2つの横に並んだ矩形についてできるだけ横幅の合計を大きくすることで達成できるので
f(y1,f(y1,x1,y2,c−1),y2,c−1)
また、上下に分割する場合のXの最大値は、複雑度c−1以下の2つの縦に並んだ矩形を、高さの合計がy2以上になるようにするという条件でできるだけ横幅を大きくすることで達成できるので
Xargmax(g(g(y1,x1,X,c−1),x1,X,c−1)≥y2)
となり、この2つのうちの大きいほうがf(y1,x1,y2,c)である。(後者は二分探索で得られる。) 同様に、g(y1,x1,x2,c)は
g(g(y1,x1,x2,c−1),x1,x2,c−1))
Yargmax(f(y1,f(y1,x1,Y,c−1),Y,c−1)≥x2)
の大きいほうに等しい。
α:=max(H,W)とするとき、計算量はO(α3log2α)。かなり厳しそうだが、TLが5秒なのでメモ化で一応通った。想定はボトムアップのDPで尺取り法っぽくやってO(α3logα)らしい。
参考:
http://drken1215.hatenablog.com/entry/2019/05/10/215400