かんプリンの学習記録

勉強したことについてメモしています. 主に競技プログラミングの問題の解説やってます.

Educational Codeforces Round1 E - Chocolate Bar

問題はこちら

問題概要

{n×m(1\le n,m\le 30)}の正方形のチョコからなる長方形の板チョコがあり, その板チョコを縦横に割っていく. 割るときにかかるコストは割る長さの2乗であり, ちょうど{1\le k\le \min(n×m,50)}この正方形のチョコに分割したい. そのように分割するときの最小コストを求めよ.

上のような質問が{1\le t\le 40910}個与えられる.

思考の流れ

制約が小さいが質問が多いので各質問に対して高速に答えるか, 前計算でいっきに求めたい. チョコを割るとサイズの小さな別の問題になるので前計算ですべて求めることができそう.
DPでやる. {dp[i][j][k]}を「{i×j}の板チョコを{k}個の正方形に分割するときの最小コスト」とすると更新式は以下のようになる.

{dp[i][j][i×j]=0}

{\displaystyle dp[i][j][k]=\min_{1\le x\le j-1,0\le y\le k}(dp[i][x][y]+dp[i][j-x][k-y]+i×i)} (縦分割)

{\displaystyle dp[i][j][k]=\min_{1\le x\le i-1,0\le y\le k}(dp[x][j][y]+dp[i-x][j][k-y]+j×j)} (横分割)

{dp[i][j][k]}は上のどちらか小さい方.

計算量はもう少し削減できそうだがこれでも十分間に合う.

提出プログラム

https://codeforces.com/contest/598/submission/77573371

感想

こういうの秒殺できるようになりたい.