差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
programming_algorithm:contest_history:atcoder:2019:0504_agc033 [2019/05/09] – [解法] ikatakos | programming_algorithm:contest_history:atcoder:2019:0504_agc033 [2019/05/10] – ikatakos | ||
---|---|---|---|
行 38: | 行 38: | ||
* $185^4 = 1, | * $185^4 = 1, | ||
* 計算量 | * 計算量 | ||
- | * ある長方形の複雑さを求めるには、全ての分割を試して最適を求める必要があり、計算量が | + | * ある長方形の複雑さを求めるには、全ての分割を試して最小値を求める必要があり、1つの長方形につき $O(H+W)$、全体で |
===解説の方法=== | ===解説の方法=== | ||
行 57: | 行 57: | ||
$(a,b,c)$ によっては複雑度 $k$ では長方形が作れないかも知れないので、その場合はそれと分かる値、たとえば'' | $(a,b,c)$ によっては複雑度 $k$ では長方形が作れないかも知れないので、その場合はそれと分かる値、たとえば'' | ||
- | DPは2段階で更新する。まず、DP1を使ってDP1を、DP2を使ってDP2を暫定更新する。次に、双方の情報を合わせてDP1、DP2を修正更新する。 | + | まず、$k=0$ の時を埋める。 |
- | まず第1段階。a,b,cが決められたとき、「縦に分割するとして」複雑さkの長方形を最大限とることを考える。左右とも複雑さ | + | $DP1[0][a][b][a]$ は、$(a,b)$ から数えて $a$ 行で同色が続く右限。これは各 |
- | | + | $DP1[0][a][b][c]$ は、まず $(a, |
+ | |||
+ | 続いてDPの遷移を考える。2段階で更新する。まず、DP1を使ってDP1を、DP2を使ってDP2を暫定更新する。次に、双方の情報を合わせてDP1、DP2を修正更新する。 | ||
+ | |||
+ | まず第1段階。a, | ||
+ | |||
+ | | ||
(a, | (a, | ||
| | | | ||
行 75: | 行 81: | ||
よって、DP1[k-1][a][b][c] でまず左の長方形の右端を求めて(rとする)、次にDP1[k-1][a][r+1][c] で右の長方形の右端を求めると、それがDP1[k][a][b][c]の暫定値となる。 | よって、DP1[k-1][a][b][c] でまず左の長方形の右端を求めて(rとする)、次にDP1[k-1][a][r+1][c] で右の長方形の右端を求めると、それがDP1[k][a][b][c]の暫定値となる。 | ||
- | DP2も、縦方向に同様にすれば求められる。 | + | DP2も、同様にすれば、横に分割すると決めた場合の暫定値を求められる。 |
次に、先ほどの更新は縦に分割するという仮定をおいたが、実際は横に分割した方が複雑さが抑えられ、より右まで複雑度 $k$ のまま範囲を伸ばせるかも知れない。 | 次に、先ほどの更新は縦に分割するという仮定をおいたが、実際は横に分割した方が複雑さが抑えられ、より右まで複雑度 $k$ のまま範囲を伸ばせるかも知れない。 | ||
- | 横方向の分割での最適な下限はDP2にあるので、それを使ってDP1を更新する。 | + | 横方向の分割での最適な下限は |
a, | a, | ||
行 85: | 行 91: | ||
| | | | ||
- | もしある $d=d_2$ の時、DP2によって、複雑度 $k$ の長方形の下限が $c_2$ であるとわかったとする。 | + | もしある $d=d_2$ の時、$DP2$ によって、複雑度 $k$ の長方形の下限が $c_2$ であるとわかったとする。 |
(a,b) | (a,b) | ||
行 92: | 行 98: | ||
| | ||
- | $DP1[a~c_2][b][c_2]$ と $d_2$ を各個比較し、もし $d_2$ の方がより右なのであれば、$d_2$ に更新する。 | + | $DP1[k][a][b][a]~DP1[k][a][b][c_2]$ と $d_2$ を各個比較し、もし $d_2$ の方がより右なのであれば、$d_2$ に更新する。 |
(a,b) | (a,d2) | (a,b) | (a,d2) | ||
行 144: | 行 150: | ||
ここで、$S$ が全て' | ここで、$S$ が全て' | ||
この場合の数え上げは、フィボナッチ数列のようにしてできる。 | この場合の数え上げは、フィボナッチ数列のようにしてできる。 | ||
+ | |||
+ | 長さ | ||
+ | 赤から始まり、末尾が赤 | ||
+ | | ||
+ | 赤から始まり、末尾が青 | ||
+ | / | ||
+ | 青から始まり、末尾が赤 | ||
+ | | ||
+ | 青から始まり、末尾が青 | ||
</ | </ | ||