2019年12月9日月曜日

JOI2018 本戦 B - 美術展

最初からA1A2...ANA_1 \le A_2 \le ... \le A_Nであると仮定してよい。この場合、大きさの最大と最小が決まっていればその範囲にある美術品はすべて展示したほうが得なので、美術品の連続部分列だけ考えればすむ。

美術品iiを展示しているとき、さらにi+1i+1を展示すると得点はBi+1(Ai+1Ai)B_{i+1}-(A_{i+1}-A_i)だけ増えることに注目してDPする。dp[i]:=i\operatorname{dp}[i] := iまで展示するとした時の最大得点、として以下のように更新していけばよい:

dp[i]max(dp[i1]+Bi(AiAi1),Bi) \operatorname{dp}[i] \leftarrow \max(\operatorname{dp}[i-1] + B_{i}-(A_i-A_{i-1}), B_{i})

答えはmaxi[N]dp[i]\max_{i \in [N]} \operatorname{dp}[i]


いわゆるKadane's algorithmっぽい感じなんだけど、なぜかそれをそのまま書いてしまってWAした。