Official

G - Strawberry War Editorial by m_99


最終的なケーキ一切れとして考えられるものはケーキの部分長方形であり、そこに載せられているイチゴの個数として考えられる値は高々 \(\frac{H(H+1)W(W+1)}{4}\) 通りです。これらの値を順に \(a_1,\ldots,a_X\) とします。
\(i=1,2,\ldots,X\) の順に、「各ケーキに載っているイチゴの個数の最小値が \(a_i\) 個以上であるように切った時のイチゴの個数の最大値の最小値 \(M\) 」を求めます。すると、最終的な答えは \(M-a_i\) の最小値です。
上の問題は \(\mathrm{dp}_{i,j,k,l,m}\) を「 \(i\leq x \lt j, k \leq y \lt l\) を満たす \((x,y)\) 全体に等しい部分長方形を、各ケーキのイチゴの個数の最小値が \(a_i\) 以上になるよう \(m\) 個に切り分ける時の各ケーキのイチゴの個数の最大値の最小値(不可能なら \(\infty\) )」とし、遷移として上下・左右のどの位置で分けるか、およびケーキの個数をどのように分けるかをすべて考えれば良いです。
\(X\)\(\mathrm{O}(H^2W^2)\)\(\mathrm{dp}\) の状態数は \(\mathrm{O}(H^2W^2T)\) 、遷移は \(\mathrm{O}((H+W)T)\) となるため、計算量は \(\mathrm{O}((H^5W^4 + H^4W^5)T^2)\) です。特に、\(H, W\) の最大値を \(N\)\(T\) の最大値を \(N^2\) とすると \(\mathrm{O}(N^{13})\) になります。これに \(N=6\) とすると \(N^{13}\)\(10^{10}\) を超えますが、定数倍が軽いため十分高速となります。
特に、「\(\mathrm{dp}\) の添え字について、\((j-i+1)(l-k+1) \lt m\) の場合は処理をしない」とした場合の各状態に対応する遷移の総和は以下のようにして \(10^5\) 程度と分かり、全体でも十分高速に正解を得られると分かります。

#include <bits/stdc++.h>
using namespace std;

int main() {
	
	int sum = 0;
	for(int i=0;i<6;i++){
		for(int j=i+1;j<=6;j++){
			for(int k=0;k<6;k++){
				for(int l=k+1;l<=6;l++){
					int h = j-i;
					int w = l-k;
					for(int m=2;m<=h*w;m++){
						sum += (h-1+w-1) * (m-1);
					}
				}
			}
		}
	}
	cout<<sum<<endl;
	
	return 0;
}

posted:
last update: