簡體   English   中英

矩陣中的最大路徑成本

[英]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
  • 鏈表的數組。 在每個數組索引中保存一個鏈表。例如,如果存在從0到5和0到1的路徑(這是一個無向圖),則您的圖將如下所示。 在此處輸入圖片說明

如果要直接圖,則只需添加adj [0] = 5而不添加adj [5] = 0,這意味着存在從0到5的路徑,而不是從5到零的路徑。

在這里,鏈表僅表示連接的節點,不增加成本。 您必須在此處添加額外的變量,以保持每個兩個節點的成本,並且看起來像這樣。

在此處輸入圖片說明

現在,不用第一個鏈表,而是將此鏈表放入您的數組中,您現在有了一個圖形來運行最短或最長路徑算法。

如果您想使用智能算法,則可以將A *與啟發式結合使用,我猜曼哈頓將是最好的選擇。

如果邊緣成本不為負,則使用Dijkstra。

如果成本為負,則使用Bellman-ford算法。

您始終可以通過將減號轉換為加號並將加號轉換為減號,然后運行最短路徑算法來找到最長路徑。 建立的路徑將是最長的。

我回答了這個問題,正如您在評論中所說的那樣,請看第二點。 如果這是一項任務,那么此分配的主要思想是確保Monotonocity

  • h代表啟發式成本。
  • A代表累計成本。

也就是說每個節點的h(A) =< h(A) + A(A,B) 意味着如果要從A移到B則成本不應降低(可以對值進行某些操作以使該屬性成立),而應增加,一旦滿足此條件,則A *選擇的每個節點都將使該節點成為您從源到目標的路徑的一部分,因為這是價值最短/最長的路徑。

pathMax您可以增強單調性。 如果存在從AB路徑,使得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)最佳答案。 但是,可能有必要擴大間隔以確保發生重疊。 並且在給定層中可能會有多個最高得分間隔。 在這一點上,我會將問題建模為有向圖:

  • 每個得分每個得分最大化水平連續間隔有一個節點。
  • 根據擴大兩個間隔以實現至少1個重疊的代價,將一層中的節點連接到下一層中的節點。 如果它們已經重疊,則成本為0。邊緣成本將始終為零或負(否則,源間隔或目標間隔可能會隨着增大而得分更高)。 將(擴展的)源節點間隔值添加到連接成本中以獲得“邊緣權重”。

然后,您可以在此圖上運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM