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

Pythonを使用してすべてのもので正方形の部分行列の数を数えるプログラム


m x nのバイナリ行列があるとすると、すべてが1である正方形の部分行列の数を見つける必要があります。

したがって、入力が次のようになっている場合。

0 1 1 1
1 1 1 1
0 1 1 1

辺1が10個、辺2が4個、辺3が1個あるため、出力は15になります。次に、正方形の総数=10 + 4 + 1=15です。

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

  • 行列に単一の行列がある場合、

    • 1を返す

  • 行:=行列の行数

  • cols:=行列の列数[0]

  • 結果:=0

  • 0から行-1までの範囲の行の場合、実行

    • 0からcols-1の範囲のcolの場合、実行します

      • 行が0と同じか、列が0と同じ場合、

        • matrix [row、col]が1と同じ場合、

          • 結果:=結果+ 1

        • それ以外の場合、matrix [row、col]が1と同じ場合、

          • square:=1 +(matrix [row-1、col]、matrix [row、col-1]およびmatrix [row-1、col-1]の最小値)

          • matrix [row、col]:=square

          • 結果:=結果+正方形

  • 結果を返す

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

def solve(matrix):
   if matrix == [[1]]:
      return 1
   rows = len(matrix)
   cols = len(matrix[0])
   result = 0
   for row in range(rows):
      for col in range(cols):
         if (row == 0 or col == 0):
            if matrix[row][col] == 1:
               result += 1
         elif matrix[row][col] == 1:
            square = min(matrix[row-1][col], min(matrix[row][col-1], matrix[row-1][col-1])) + 1
            matrix[row][col] = square
            result += square
   return result
matrix = [[0,1,1,1],[1,1,1,1],[0,1,1,1]]
print(solve(matrix))

入力

{{0,1,1,1},{1,1,1,1},{0,1,1,1}}

出力

15

  1. PythonでnノードのBSTの数をカウントするプログラム

    n個の異なるノードがあるとします。すべてが異なります。二分探索木を形成するためにそれらを配置できる方法の数を見つける必要があります。二分探索木で知っているように、左側のサブツリーは常に小さい値を保持し、右側のサブツリーは大きい値を保持します。 これを解決するために、カタラン数を見つけます。カタラン数C(n)は、n個の異なるキーを持つ二分探索木を表します。式は次のようになります $$ C(n)=\ frac {(2n)!} {(n + 1)!\ times n!} $$ したがって、入力がn =3の場合、出力は5になります。 これを解決するには、次の手順に従います- 関数ncr

  2. Pythonを使用してすべてのノードに到達するための頂点の最小数を見つけるプログラム

    n個の頂点とノードに0からn-1までの番号が付けられた有向非巡回グラフがあるとします。グラフはエッジリストで表されます。ここで、edges [i] =(u、v)はノードuからノードv。グラフ内のすべてのノードに到達できる頂点の最小セットを見つける必要があります。 (頂点は任意の順序で返すことができます)。 したがって、入力が次のような場合 これらの2つの頂点は他のどの頂点からも到達できないため、出力は[0,2,3]になります。したがって、それらから開始すると、すべてをカバーできます。 これを解決するには、次の手順に従います- n:=エッジのサイズ all_nodes:=