問題概要
n×m のグリッドからなる迷路を考えます。各セル (i, j) には方向指示 di,j と重み vi,j が設定されています。プレイヤーは初期位置 (sx, sy) から左足で踏み込み、その時点で vsx,sy を加算し、セルの重みを -vsx,sy に反転させます。
その後、各ステップで以下の選択肢があります:
- ゲームを終了し、現在のスコアを最終スコアとする
- 現在のセルの方向指示に従って次のセル (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 を実現できます。