[英]Maximum path cost in matrix
誰能告訴算法在NxM
矩陣中找到最大路徑成本的算法,該算法從左上角開始到右下角以left,right結束,矩陣中允許向下移動,並且包含負成本。 可以多次訪問一個單元,訪問單元后其成本將替換為0
約束條件
1 <= nxm <= 4x10 ^ 6
輸入
4 5
1 2 3 -1 -2
-5 -8 -1 2 -150
1 2 3 -250 100
1 1 1 1 20
輸出值
37
在圖像中給出了解釋輸出解釋
由於您也有負成本,因此請使用Bellman-ford。 您要做的是更改所有成本的符號(將負號轉換為正號,將正號轉換為負號),然后找到最短的路徑,這條路徑將是最長的,因為您更改了符號。
如果該符號永遠不會變成負數,則使用dijkstra shrtest-path,但在此之前將所有值都設為負數,這將以成本的形式返回最長的路徑。
矩陣是直接圖。 在您的圖像中,您嘗試查找從索引(0,0)到(n-1,n-1)的路徑(最大或最小)。
您需要這些東西才能將其表示為圖形。
first_Node, second_Node,Cost to move from first node to second
。 如果要直接圖,則只需添加adj [0] = 5而不添加adj [5] = 0,這意味着存在從0到5的路徑,而不是從5到零的路徑。
在這里,鏈表僅表示連接的節點,不增加成本。 您必須在此處添加額外的變量,以保持每個兩個節點的成本,並且看起來像這樣。
現在,不用第一個鏈表,而是將此鏈表放入您的數組中,您現在有了一個圖形來運行最短或最長路徑算法。
如果您想使用智能算法,則可以將A *與啟發式結合使用,我猜曼哈頓將是最好的選擇。
如果邊緣成本不為負,則使用Dijkstra。
如果成本為負,則使用Bellman-ford算法。
您始終可以通過將減號轉換為加號並將加號轉換為減號,然后運行最短路徑算法來找到最長路徑。 建立的路徑將是最長的。
我回答了這個問題,正如您在評論中所說的那樣,請看第二點。 如果這是一項任務,那么此分配的主要思想是確保Monotonocity
。
也就是說每個節點的h(A) =< h(A) + A(A,B)
。 意味着如果要從A
移到B
則成本不應降低(可以對值進行某些操作以使該屬性成立),而應增加,一旦滿足此條件,則A *選擇的每個節點都將使該節點成為您從源到目標的路徑的一部分,因為這是價值最短/最長的路徑。
pathMax您可以增強單調性。 如果存在從A
到B
路徑,使得f(S ... AB)<f(S ..B),則設置f(S ... AB)的成本= Max(f(S ... AB) ,f(S ... A)),其中S表示來源。
由於不允許向上移動,因此路徑始終看起來像一組水平間隔,它們共享至少一個位置(對於向下移動)。 答案可以被描述為
struct Answer {
int layer[N][2]; // layer[i][0] and [i][1] represent interval start&end
// with 0 <= layer[i][0] <= layer[i][1] < M
// layer[0][0] = 0, layer[N][1] = M-1
// and non-empty intersection of layers i and i+1
};
另一種編碼方式是僅注意層的寬度和彼此的偏移量; 但是您仍然必須確保最后一層包括出口單元。
假設您有一個maxLayer
例程,該例程在每一層中都找到了最高得分間隔(每層常數O(M)
),並且所有這樣的層都重疊,那么這將產生O(N+M)
最佳答案。 但是,可能有必要擴大間隔以確保發生重疊。 並且在給定層中可能會有多個最高得分間隔。 在這一點上,我會將問題建模為有向圖:
然后,您可以在此圖上運行Dijkstra(取反邊權重,以便返回“最長路徑”)以找到最佳路徑。 更好的是,由於所有路徑一次穿過每個層一次,因此您只需要跟蹤到達每個節點的最佳路線,並且只需要為要處理的層構建節點和邊緣即可。
實施細節
要計算O(M)中的maxLayer ,請使用經過修改的Kadane算法 ,以返回所有最大間隔,而不是僅返回第一個最大間隔。 如果鏈接算法放棄了一個間隔並重新開始,則應保留該競爭者的副本以供以后使用。
給定樣本輸入,最大間隔如下所示:
[0] 1 2 3 -1 -2 [1 2 3] -5 -8 -1 2 -150 => [2] 1 2 3 -250 100 [1 2 3] [100] 1 1 1 1 20 [1 1 1 1 20] [0]
給定這些間隔,它們將產生以下圖形:
(0) | =>0 (+6) \\ -1=>5 \\ (+2) =>7/ \\ -150=>-143 / \\ (+7) (+100) =>12 \\ / =>-43 \\ / (+24) | =>37 (0)
當兩個邊沿在單個節點上傾斜(行1 1 1 1 20)時,僅結轉最高輸入值。
對於一行中的每個元素,如果我們在該行中進行水平移動,則找到如果我們在該行中水平移動,則可以獲得的最大成本。
例如。 對於行
1 2 3 -1 -2
如果我們通過該元素水平移動,則獲得的每個元素的最大成本為
6 6 6 5 3
說明:
對於元素3:我們可以向后水平觸摸1和2。因為值-1和-2會降低成本值,所以我們不會水平向前移動。
因此,最大成本為3 = 1 + 2 + 3 = 6
如果我們水平移動,則一行中每個元素的最大成本矩陣,對於您在描述中給出的輸入,將為
6 6 6 5 3
-5 -7 1 2 -148
6 6 6 -144 100
24 24 24 24 24
由於我們可以從一行垂直移到下一行,因此,如下更新每個元素的最大費用:
cost[i][j] = cost[i][j] + cost[i-1][j]
因此,最終成本矩陣為:
6 6 6 5 3
1 -1 7 7 -145
7 5 13 -137 -45
31 29 37 -113 -21
上述矩陣最后一行的最大值將為您提供所需的輸出,即37
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.