Pythonで最小値が最大のパス
R行とC列の整数の行列Aがあるとすると、[0,0]で始まり[R-1、C-1]で終わるパスの最大スコアを見つける必要があります。ここで、スコアリング手法はそのパスの最小値になります。たとえば、パス8→4→5→9の値は4です。パスは、4つの主要な方向(北、東、西、南)のいずれかで、1つの訪問済みセルから隣接する未訪問セルに数回移動します。 。
たとえば、グリッドが-
のような場合5 | 4 | 5 |
1 | 2 | 6 |
7 | 4 | 6 |
オレンジ色のセルがパスになります。出力は4です
これを解決するには、次の手順に従います-
- r:=行数およびc:=列数
- ans:=最小値のA [0、0]およびA [r – 1、c – 1]
- Aと同じ順序でvisitedと呼ばれる1つの行列を作成し、これをFALSEで埋めます
- h:=タプルを格納するリスト(-A [0、0]、0、0)
- hからヒープを作成する
- hが空でない間
- v、x、y:=ヒープからhを削除し、3つの値を格納します
- x =r – 1およびy:=c – 1の場合、ループから抜け出します
- ans:=最小のans、A [x、y]
- visited [x、y]:=true
- dyの場合、リスト内のdx [(-1、0)、(1、0)、(0、1)、(0、-1)]、do
- a:=x + dxおよびb:=y + dy
- aが0〜r – 1の範囲にあり、bが0〜c – 1の範囲にあり、visited [a、b]がfalseの場合、
- (-A [a、b]、a、b)をhでヒープに挿入します
- 回答を返す
理解を深めるために、次の実装を見てみましょう-
例
import heapq class Solution(object): def maximumMinimumPath(self, A): """ :type A: List[List[int]] :rtype: int """ r,c = len(A),len(A[0]) ans = min(A[0][0],A[-1][-1]) visited = [[False for i in range(c)] for j in range(r)] h = [(-A[0][0],0,0)] heapq.heapify(h) while h: # print(h) v,x,y = heapq.heappop(h) if x== r-1 and y == c-1: break ans = min(ans,A[x][y]) visited[x][y]= True for dx,dy in {(-1,0),(1,0),(0,1),(0,-1)}: a,b = x+dx,y+dy if a>=0 and a<r and b>=0 and b<c and not visited[a][b]: heapq.heappush(h,(-A[a][b],a,b)) return ans
入力
[[5,4,5],[1,2,6],[7,4,6]]
出力
4
-
Pythonを使用して最大の確率でパスを見つけるプログラム
n個のノード(ノードには0から番号が付けられます)を持つ無向加重グラフがあるとします。このグラフは、エッジリストを使用して入力として与えられ、各エッジeについて、そのエッジ確率[e]を通過する成功の確率があります。開始ノードと終了ノードもあります。最初から最後まで成功の確率が最大のパスを見つけて、成功の確率を返す必要があります。パスが見つからない場合は、0を返します。 したがって、入力が次のような場合 ノード0から2へのパスが2つあるため、出力は0.24になります。1つは確率0.2、もう1つはノード1を経由するパスの確率は0.4 * 0.6 =0.24で、これが最大です。 これを解
-
Pythonで最小コストで都市を接続する
1からNまでの番号が付けられたN個の都市があるとします。接続があります。各接続[i]は[city1、city2、cost]で、これはcity1とcity2を接続するためのコストを表します。 。都市のすべてのペアに対して、これら2つの都市を接続する接続パス(おそらく長さ1)が存在するように、最小コストを見つける必要があります。コストは、使用された接続コストの合計です。タスクが不可能な場合は、-1を返します。 したがって、グラフが次のような場合- その場合、出力は6になります。任意の2つの都市を選択すると、すべての都市が接続されるため、最小の2、[1、5]を選択します。 これを解決する