無駄なダメージを与える攻撃の除去
列の端を対象にしたシージモードの攻撃で減る体力の総和は最大 であり、 なら最大 である。同じ変化は費用 以下のタンクモードの攻撃で再現できる。したがって、端をシージモードで攻撃しない最適解が存在する。
シージモードの攻撃は、体力の総和を最大 減らす。体力が で止まるためにダメージが少しでも無駄になった場合、実際の減少量の総和は 以下である。その攻撃を、実際の減少量と同じ回数のタンクモードの攻撃に置き換えると、費用 以下で同じ状態に到達できる。したがって、すべてのシージモードの攻撃でダメージが完全に適用される最適解が存在する。
シージモードの攻撃回数の最大化
位置 に対するシージモードの攻撃回数を とする。上の考察により、端への攻撃を除いて とおく。各位置で次の条件が必要である。
逆に、この条件を満たすなら、どの順番でシージモードの攻撃を行ってもダメージが無駄にならない。残った体力はタンクモードで減らせる。 とすると、シージモードで体力の総和が 減るため、費用の合計は
となる。よって、条件を満たす非負整数 の総和を最大化すればよい。
動的計画法
、 とおく。すべての は 以上 以下である。
位置 を処理する直前の を、位置 までの条件を満たし、、 であるときの、決定済みの値 の総和の最大値とする。不可能な状態は負の無限大とする。初期状態は であり、それ以外は不可能である。
を決めると、現在の位置の条件は となる。したがって、遷移は
である。 の場合は のみを許す。 を固定して 方向の累積最大値を求めると、各遷移を 時間で計算できる。位置 まで処理した後の がシージモードの攻撃回数の最大値となる。
遷移は次の回数をすべて調べ、ちょうど現在の位置の体力条件を確認する。帰納法により、DP はすべての実行可能な配置と最大回数を正しく保持する。答えは である。
時間計算量は 、空間計算量は である。 より となる。 を用いる表記は、すべての体力が の場合にも有効である。
サブタスク
Solution written by GPT6