Div2-600 Div1-275 「Stamp」 解説 writer: ir5 tester: misof, ivan_metelsky, rng_58 問題設定 1×N の長方形がある.各セルに次の手順で色を塗りたい • 好きな長さのスタンプを1つだけ作る (この長さを L とする) • スタンプを好きなだけ押す:まず,好きな色を選び, 続いて好きな場所(連続した L 個のセル)に色を塗る. スタンプを押そうとしてる場所に,選んだ色と違う色が 塗られたセルがあるとき,そこにはスタンプを押せない. 最終的に各セルの色を与えられたパターンにしたい. * * 問題設定 (cont.) 1×N の長方形がある.各セルに次の手順で色を塗りたい 塗り終わった後, L×stampCost + (スタンプを押した回数)×pushCost だけコストが発生する.必要なコストを最小化せよ. Constraints: N ≤ 50 * * Example 0 stampCost = 1 pushCost = 1 みたいなとき,スタンプのサイズを L=2 にして ↓ みたいに押す. コストは 1*2 + 3*1 = 5 でこれが最小. 解法 (「*」無し) とりあえず「*」 無しで考えてみる. N ≤ 50 とかなのでスタンプのサイズ L を固定してみる. • 「色を上書きできない」という制約から,色をまたぐことはできない. • 各色のカタマリ(連結成分)ごとに考えればいい. 解法 (「*」無し) 左から順に押せば長さ x の連結成分はceil(x / L) 回で押せるので, 単に連続する色の長さを調べればいい. 解法 (「*」有り) 「*」 があるときは連結成分の”切れ目”がわからない. → スタンプを押す回数が最小になる切れ目を探せばいい. dp[i] := セル[i.. N] について問題を解く時のスタンプ使用回数 とすると,i から次の切れ目位置を k として dp[i] = min i+L ≤ k ceil((k – i) / L) + dp[k] (ただしセル[i..k]は1色で塗れる) とかになる. 計算量は O(N3) とか O(N4). k i * *
© Copyright 2024 ExpyDoc