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

Pythonの特定の行列で最も長く増加するパスの長さにプログラムする


2Dマトリックスがあるとすると、厳密に増加する最長のパスの長さを見つける必要があります。パスをトラバースするには、上、下、左、右、または斜めに移動できます。

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

2 4 6
1 5 7
3 3 9

最長のパスは[1、2、4、6、7、9]

であるため、出力は6になります。

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

n := row count of matrix , m := column count of matrix
moves := a list of pairs to move up, down, left and right [[1, 0], [-1, 0], [0, 1], [0, -1]]
Define a function dp() . This will take y, x
if x and y are in range of matrix, then
   return 0
currVal := matrix[y, x]
res := 0
for each d in moves, do
   (dy, dx) := d
   (newY, newX) := (y + dy, x + dx)
      if newY and newX are in range of matrix and matrix[newY, newX] > currVal, then
         res := maximum of res and dp(newY, newX)
return res + 1
From the main method do the following:
result := 0
for i in range 0 to n - 1, do
   for j in range 0 to m - 1, do
      result := maximum of result and dp(i, j)
return result

例(Python)

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

class Solution:
   def solve(self, matrix):
      n, m = len(matrix), len(matrix[0])
      moves = [[1, 0], [-1, 0], [0, 1], [0, -1]]
      def dp(y, x):
         if y < 0 or y >= n or x < 0 or x >= m:
            return 0
         currVal = matrix[y][x]
         res = 0
         for d in moves:
            dy, dx = d
            newY, newX = y + dy, x + dx
            if (newY >= 0 and newY < n and newX >= 0 and newX < m and matrix[newY][newX] > currVal):
               res = max(res, dp(newY, newX))
         return res + 1
      result = 0
      for i in range(n):
         for j in range(m):
            result = max(result, dp(i, j))
      return result
ob = Solution()
matrix = [
   [2, 4, 6],
   [1, 5, 7],
   [3, 3, 9]
]
print(ob.solve(matrix))

入力

[ [2, 4, 6], [1, 5, 7], [3, 3, 9] ]

出力

6

  1. Pythonでバイナリツリーの最長の連続パスの長さを見つけるプログラム

    二分木があるとしましょう。二分木で最長のパスを見つける必要があります。 したがって、入力が次のような場合 連続する最長のシーケンスが[2、3、4、5、6]であるため、出力は5になります。 これを解決するには、次の手順に従います- rootがnullの場合、 0を返す maxPath:=0 関数helper()を定義します。これはノードを取ります inc:=1、dec:=1 ノードの左側がnullでない場合、 [left_inc、left_dec]:=ヘルパー(ノードの左側) それ以外の場合、 [left_inc、left_dec]:=[0、0] ノード

  2. Pythonで二分木の最長交互パスの長さを見つけるプログラム

    二分木があるとすると、左と右の子を交互に繰り返して下る最長のパスを見つける必要があります。 したがって、入力が次のような場合 交互のパスが[2、4、5、7、8]であるため、出力は5になります。 これを解決するには、次の手順に従います。 rootがnullの場合、 0を返す 関数dfs()を定義します。これには、ノード、カウント、フラグが必要です ノードがnullでない場合、 フラグがTrueと同じ場合、 a:=dfs(ノードの左側、カウント+ 1、False) b:=dfs(ノードの右側、1、True) それ以外の場合、フラグがFalseと同じ場合、 a:=dfs