2次元配列のハウスグラス(Hourglass)パターン


以下に、ハウスグラスパターンを見つけるためのいくつかの方法と、それぞれの方法のコード例を示します。

  1. ブルートフォース法: 2次元配列のすべての要素について、ハウスグラスパターンの形状を検証します。各要素を中心としてハウスグラスの形状をチェックし、最大のハウスグラスパターンを見つけます。

    def find_hourglass(arr):
       max_sum = float('-inf')
       for i in range(len(arr) - 2):
           for j in range(len(arr[i]) - 2):
               current_sum = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2]
               max_sum = max(max_sum, current_sum)
       return max_sum
  2. 動的計画法(Dynamic Programming): ハウスグラスパターンの形状をメモ化しながら、2次元配列を走査します。最後に、最大のハウスグラスパターンの合計値を取得します。

    def find_hourglass(arr):
       max_sum = float('-inf')
       memo = [[0] * len(arr[0]) for _ in range(len(arr))]
       for i in range(len(arr) - 2):
           for j in range(len(arr[i]) - 2):
               if i == 0 and j == 0:
                   memo[i][j] = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2]
               else:
                   memo[i][j] = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2] + memo[i-1][j-1]
               max_sum = max(max_sum, memo[i][j])
       return max_sum

これらはハウスグラスパターンを見つけるための2つの一般的なアプローチです。他にもさまざまな方法がありますが、上記のコード例を参考にしてみてください。