Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの行列で最大の非負の積を見つけるプログラム


次数mxnの行列があるとします。最初は左上隅のセル(0、0)にあり、各ステップで、マトリックス内で右または下にのみ移動できます。ここで、左上隅のセル(0、0)から右下隅のセル(m-1、n-1)までのすべての可能なパスの中から、負でない積が最大になるパスを見つける必要があります。答えが大きすぎる場合は、10 ^ 9+7を法とする最大の非負の積を返します。

したがって、入力が次のような場合

2 -4 2
2 -4 2
4 -8 2

パスが色付きであるため、出力は256になります。

2 -4 2
2 -4 2
4 -8 2

したがって、積は[2 * 2 *(-4)*(-8)* 2]=256です。

これを解決するには、次の手順に従います-

  • p:=10 ^ 9 + 7
  • m:=行列の行数
  • n:=行列の列数
  • dp:=2次元行列は、指定された行列と次数であり、0で埋められます
  • 0からm-1の範囲のiの場合、do
    • 0からn-1の範囲のjの場合、do
      • iが0と同じで、jが0と同じ場合、
        • dp [i、j]:=ペアを作成します(matrix [i、j]、matrix [i、j])
      • それ以外の場合、iが0と同じ場合、
        • ans1:=dp [i、j-1、0] * matrix [i、j]
        • dp [i、j]:=ペアを作成する(ans1、ans1)
      • それ以外の場合、jが0と同じ場合、
        • ans1:=dp [i-1、j、0] * matrix [i、j]
        • dp [i、j]:=ペアを作成する(ans1、ans1)
      • それ以外の場合、
        • ans1:=dp [i-1、j、0] * matrix [i、j]
        • ans2:=dp [i-1、j、1] * matrix [i、j]
        • ans3:=dp [i、j-1、0] * matrix [i、j]
        • ans4:=dp [i、j-1、1] * matrix [i、j]
        • 最大:=ans1、ans2、ans3、ans4の最大値
        • 最小:=ans1、ans2、ans3、ans4の最小値
        • 最大値が0未満の場合、
          • dp [i、j]:=ペアを作成します(最小、最小)
        • それ以外の場合、最小値> 0の場合、
          • dp [i、j]:=ペアを作成します(最大、最大)
        • それ以外の場合、
          • dp [i、j]:=ペアを作成します(最大、最小)
  • dp [m-1、n-1、0] <0の場合、
    • 戻り値-1
  • それ以外の場合、
    • return dp [m-1、n-1、0]%p

理解を深めるために、次の実装を見てみましょう-

def solve(matrix):
   p = 1e9+7
   m = len(matrix)
   n = len(matrix[0])

   dp = [[0 for _ in range(n)] for _ in range(m)]

   for i in range(m):
      for j in range(n):
         if i == 0 and j == 0:
            dp[i][j] = [matrix[i][j], matrix[i][j]]

         elif i == 0:
            ans1 = dp[i][j-1][0] * matrix[i][j]
            dp[i][j] = [ans1, ans1]

         elif j == 0:
            ans1 = dp[i-1][j][0] * matrix[i][j]
            dp[i][j] = [ans1, ans1]

         else:
            ans1 = dp[i-1][j][0] * matrix[i][j]
            ans2 = dp[i-1][j][1] * matrix[i][j]
            ans3 = dp[i][j-1][0] * matrix[i][j]
            ans4 = dp[i][j-1][1] * matrix[i][j]
            maximum = max(ans1, ans2, ans3, ans4)
            minimum = min(ans1, ans2, ans3 ,ans4)
            if maximum < 0:
               dp[i][j] = [minimum, minimum]
            elif minimum > 0 :
               dp[i][j] = [maximum, maximum]
            else:
               dp[i][j] = [maximum, minimum]

   if dp[m-1][n-1][0] < 0:
      return -1
   else:
      return int(dp[m-1][n-1][0] % p)

matrix = [[2,-4,2],[2,-4,2],[4,-8,2]]
print(solve(matrix))

入力

"pqpqrrr"

出力

256

  1. Pythonで最大の建物の高さを見つけるプログラム

    値nと、制限と呼ばれるペアの別のリストがあるとします。都市にn棟の新しい建物を建てたいと思っています。ただし、制限はほとんどありません。私たちは一列に建てることができ、建物には1からnまでのラベルが付けられています。制限には2つのパラメーターがあるため、restrictions [i] =(id_i、max_height_i)は、id_iの高さがmax_height_i以下でなければならないことを示します。新しい建物の高さに関する市の制限は次のとおりです- 各建物の高さは0または正の値である必要があります。 最初の建物の高さは0でなければなりません。 隣接する2つの建物の高さ

  2. 行列の転置を見つけるPythonプログラム

    この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 行列が与えられた場合、転置を同じ行列に格納して表示する必要があります。 行列の転置は、行を列に、列を行に変更することで得られます。つまり、A行列の転置はA[i][j]をA[j][i]に変更することで得られます。 以下に示す実装を見てみましょう- 例 N = 4 def transpose(A):    for i in range(N):       for j in range(i+1, N):     &nbs