在Python中找到矩阵中最大非负乘积的程序

在Python中找到矩阵中最大非负乘积的程序

假设我们有一个m x n的矩阵。最开始我们在左上角的单元格(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 := 给定矩阵的二维矩阵,并填充为0
  • for i in range 0 to m – 1, do
    • for j in range 0 to n – 1, do
      • 如果i和j都等于0,那么
      • dp[i, j] := make a pair (matrix[i, j], matrix[i, j])
      • 否则当i等于0时,那么
      • ans1 := dp[i, j-1, 0] * matrix[i, j]
      • dp[i, j] := make a pair (ans1, ans1)
      • 否则当j等于0时,那么
      • ans1 := dp[i-1, j, 0] * matrix[i, j]
      • dp[i, j] := make a pair (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]
      • maximum := ans1、ans2、ans3和ans4中的最大值
      • minimum := ans1、ans2、ans3和ans4中的最小值
      • 如果maximum <0,则
        • dp[i, j] := make a pair (minimum, minimum)
      • 否则当minimum > 0时,那么
        • dp[i, j] := make a pair (maximum, maximum)
      • 否则,
        • dp[i, j] := make a pair (maximum, minimum)
  • 如果dp[m-1, n-1, 0] < 0,则
    • 返回-1
  • 否则,
    • 返回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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程