D]競技プログラミングhttps://www.hackerrank.com/contests/w35/challenges/matrix-land縦H、横Wの行列Aがある。この行列上で以下のゲームを行う。愚直に更新していく操作を考えると、(x,y)への遷移で考えるべきは、(0,y-1)~(W-1,y-1)からの遷移である。x≦zとしてdp[y][x]からdp[y+1][z]への遷移を考える。(x,y)のマスまででdp[y][x]点取れる。次に、そのまま下に移動して、(x,y+1)のマスへ移る。そこから、横に移動して(x,y+1)~(z,y+1)のマスの点数を取り、dp[y+1][z]の点とする。[x,z]の点の総和)をすれば遷移ができる。実はこれでは最適ではない場合がある。(x,y+1)から直接(z,y+1)に行くのではなく、(x,y+1)よりも左にちょっと行ってから、(z,y+1)に向かったほうがオトクな場合がある。同様に(x,y+1)から(z,y+1)へ向かった後に、そこで止まらずに(z,y+1)よりも右にちょっと行ってから、(z,y+1)に戻った方がオトクな場合がある。この二つのお得な場合を予め計算しておこう。D[z])最大値をとっているが、よくよくみると、xが関連してくる所とそうでない所がある。xが関連してないものを外に出すとこうなる。D[z]);}すると最大を探している部分はセグメントツリーで高速化できることが分かる。そのため、区間最大のセグメントツリーにこの部分を置いて高速に取得できるようにすれば計算量的に間に合う。B]月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。