Pythonで左上のポイントから右下のポイントに到達できる方法の数を見つけるためのプログラム
1つのNxMバイナリ行列があるとします。ここで、0は空のセルを意味し、1はブロックされたセルを意味します。左上隅から始めて、右下隅に到達する方法の数を見つける必要があります。答えが非常に大きい場合は、10 ^ 9+7で変更します。
したがって、入力が次のような場合
0 | 0 | 1 |
0 | 0 | 0 |
1 | 1 | 0 |
右下に移動するには、[右、下、右、下]と[下、右、右、下]の2つの方法があるため、出力は2になります。
これを解決するには、次の手順に従います-
- dp:=指定された行列と同じサイズの行列で、0で埋めます
- dp [0、0]:=1
- 1から行列の行数までの範囲のiについては、
- matrix [i、0]が1と同じ場合、
- ループから抜け出す
- それ以外の場合、
- dp [i、0]:=1
- matrix [i、0]が1と同じ場合、
- 1から行列の列数までの範囲のjについては、
- matrix [0、j]が1と同じ場合、
- ループから抜け出す
- それ以外の場合、
- dp [0、j]:=1
- matrix [0、j]が1と同じ場合、
- 1から行列の行数までの範囲のiについては、
- 1から行列の列数までの範囲のjについては、
- matrix [i、j]が1と同じ場合、
- dp [i、j]:=0
- それ以外の場合、
- dp [i、j]:=dp [i-1、j] + dp [i、j-1]
- matrix [i、j]が1と同じ場合、
- 1から行列の列数までの範囲のjについては、
- dpの右下の値を返す
例(Python)
理解を深めるために、次の実装を見てみましょう-
class Solution: def solve(self, matrix): dp = [[0] * len(matrix[0]) for _ in range(len(matrix))] dp[0][0] = 1 for i in range(1, len(matrix)): if matrix[i][0] == 1: break else: dp[i][0] = 1 for j in range(1, len(matrix[0])): if matrix[0][j] == 1: break else: dp[0][j] = 1 for i in range(1, len(matrix)): for j in range(1, len(matrix[0])): if matrix[i][j] == 1: dp[i][j] = 0 else: dp[i][j] = dp[i - 1][j] + dp[i][j - 1] return dp[-1][-1] ob = Solution() matrix = [ [0, 0, 1], [0, 0, 0], [1, 1, 0] ] print(ob.solve(matrix))
入力
matrix = [ [0, 0, 1], [0, 0, 0], [1, 1, 0] ]
出力
2
-
Pythonで右下隅に到達するために必要なセルの最小数を見つけるためのプログラム
迷路を表す2Dグリッドがあり、0は空きスペース、1は壁であるとします。 grid [0、0]から始めます。グリッドの右下隅に到達するために必要な、最小の正方形の数を見つける必要があります。到達できない場合は、-1を返します。 したがって、入力が次のような場合 0 0 0 1 0 0 1 0 0 その場合、出力は5になります これを解決するには、次の手順に従います- R:=グリッドの行数、C:=グリッドの列数 q:=[0、0、1] A [0、0]が1の場合、それ以外の場合は新しいリスト A [0、0]:=1
-
Pythonでメッセージをデコードできるいくつかの方法を見つけるためのプログラム
a =1、b =2、...z =26のようなマッピングがあり、エンコードされたメッセージメッセージ文字列があるとすると、デコードできる方法の数を数える必要があります。 したがって、入力がmessage =222の場合、出力は3になります。これは、bbb、bv、vbの3つの方法でデコードできるためです。 これを解決するには、次の手順に従います- memo:=メッセージサイズ+1と同じサイズの0のリスト memo [0]:=1 memo [1]:=1(message [0]が「0」と同じでない場合)それ以外の場合は0 2からメッセージのサイズまでの範囲のiの場合、実