グリッド迷路での最適経路探索

問題概要

n×m のグリッドからなる迷路を考えます。各セル (i, j) には方向指示 di,j と重み vi,j が設定されています。プレイヤーは初期位置 (sx, sy) から左足で踏み込み、その時点で vsx,sy を加算し、セルの重みを -vsx,sy に反転させます。

その後、各ステップで以下の選択肢があります:

  1. ゲームを終了し、現在のスコアを最終スコアとする
  2. 現在のセルの方向指示に従って次のセル (x, y) に移動する

選択肢2を選んだ場合:

  • 現在のセルに左足で踏み入れていた場合:右足で (x, y) に踏み込み、スコアから vx,y を減算
  • 現在のセルに右足で踏み入れていた場合:左足で (x, y) に踏み込み、スコアに vx,y を加算
  • 移動後、vx,y を -vx,y に反転させる

方向指示のルール:

  • '^':上方向へ移動 (i-1, j)
  • 'v':下方向へ移動 (i+1, j)
  • '<':左方向へ移動 (i, j-1)
  • '>':右方向へ移動 (i, j+1)

次のセルがグリッド範囲外の場合は選択肢2を選べません。

全てのセル (i, j) を起点とした場合の最大最終スコア ansi,j を求め、以下の式で与えられるハッシュ値を出力してください:

Σi=1n Σj=1m (ansi,j + B) × C(i-1)m+j-1 (mod 264)

ただし、B = 1015、C = 2×1015 + 21 です。

もし (i, j) を起点として無限に大きなスコアを得られる場合、ansi,j = B とします。

入力形式

最初の行:2つの正整数 n, m(スペース区切り)

続く n 行:各行が文字列 di(方向指示)

続く n 行:各行が m 個の整数 vi,1, vi,2, ..., vi,m(スペース区切り)

出力形式

1つの整数(ハッシュ値)を出力

サンプル入力

3 3
><>
>vv
^<<
1 2 3
4 5 6
7 8 9

サンプル出力

3946712175731523781

サンプル説明

各セルを起点とした場合の最大スコア行列:

1 2 3
7 5 6
8 8 17

制約

  • 10% のデータ:1 ≤ n, m ≤ 10
  • 40% のデータ:1 ≤ n, m ≤ 100
  • 100% のデータ:1 ≤ n, m ≤ 1000
  • di,j ∈ {'^', 'v', '<', '>'}
  • -109 ≤ vi,j ≤ 109

注意:C/C++ を使用する場合、unsigned long long 型の自然なオーバーフローを利用して mod 264 を実現できます。

タグ: アルゴリズム 動的計画法 グラフ理論 ゲーム理論

8月31日 20:47 投稿