简体   繁体   中英

Maximum path cost in matrix

Can anyone tell the algorithm for finding the maximum path cost in a NxM matrix starting from top left corner and ending with bottom right corner with left ,right , down movement is allowed in a matrix and contains negative cost. A cell can be visited any number of times and after visiting a cell its cost is replaced with 0

Constraints
1 <= nxm <= 4x10^6
INPUT

4 5
1 2 3 -1 -2
-5 -8 -1 2 -150
1 2 3 -250 100
1 1 1 1 20

OUTPUT

37

Explanation is given in the image Explanation of Output

Since you have also negative costs then use bellman-ford. What you do is that you change sign of all the costs(convert negative signs to positive and positive to negative) then find the shortest path and this path will be the longest because you have changed the signs.

If the sign is never becoms negative then use dijkstra shrtest-path but before that make all values negative and this will return you the longest path with it's cost.

You matrix is a direct graph. In your image you are trying to find a path(max or min) from index (0,0) to (n-1,n-1).

You need these things to represent it as a graph.

  • You need a linkedlist and in each node you have a first_Node, second_Node,Cost to move from first node to second .
  • An array of linkedlist. In each array index you save a linkedlist.If for example there is a path from 0 to 5 and 0 to 1(it's an undirected graph) then your graph will look like this. 在此处输入图片说明

If you want a direct-graph then simply add in adj[0] = 5 and do not add in adj[5] = 0 , this means that there is path from 0 to 5 but not from 5 to zero.

Here linkedlist represents only nodes which are connected not there cost. You have to add extra variable there which keep cost for each two nodes and it will look like this.

在此处输入图片说明

Now instead of first linkedlist put this linkedlist in your array and you have a graph now to run shortest or longest path algorithm.

If you want an intellgent algorithm then you can use A* with heuristic, i guess manhattan will be best.

If cost of your edges is not negative then use Dijkstra.

If cost is negative then use bellman-ford algorithm.

You can always find the longest path by converting the minus sign to plus and plus to minus and then run shortest path algorithm. Path founded will be longest.

I answered this question and as you said in comments to look at point two. If that's a task then main idea of this assignment is ensure the Monotonocity .

  • h stands for heuristic cost.
  • A stands for accumulated cost.

Which says that each node the h(A) =< h(A) + A(A,B) . Means if you want to move from A to B then cost should not be decreasing(can you do something with your values such that this property will hold) but increasing and once you satisfy this condition then everyone node which A* chooses , that node will be part of your path from source to Goal because this is the path with shortest/longest value.

pathMax You can enforece monotonicity. If there is path from A to B such that f(S...AB) < f(S ..B) then set cost of the f(S...AB) = Max(f(S...AB) , f(S...A)) where S means source.

Since moving up is not allowed, paths always look like a set of horizontal intervals that share at least 1 position (for the down move). Answers can be characterized as, say

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 
};

An alternative encoding is to note only layer widths and offsets to each other; but you would still have to make sure that the last layer includes the exit cell.

Assuming that you have a maxLayer routine that finds the highest-scoring interval in each layer (const O(M) per layer), and that all such such layers overlap, this would yield an O(N+M) optimal answer. However, it may be necessary to expand intervals to ensure that overlap occurs; and there may be multiple highest-scoring intervals in a given layer. At this point I would model the problem as a directed graph:

  • each layer has one node per score-maximizing horizontal continuous interval.
  • nodes from one layer are connected to nodes in the next layer according to the cost of expanding both intervals to achieve at least 1 overlap. If they already overlap, the cost is 0. Edge costs will always be zero or negative (otherwise, either source or target intervals could have scored higher by growing bigger). Add the (expanded) source-node interval value to the connection cost to get an "edge weight".

You can then run Dijkstra on this graph (negate edge weights so that the "longest path" is returned) to find the optimal path. Even better, since all paths pass once and only once through each layer, you only need to keep track of the best route to each node, and only need to build nodes and edges for the layer you are working on.

Implementation details ahead

  • to calculate maxLayer in O(M), use Kadane's Algorithm , modified to return all maximal intervals instead of only the first. Where the linked algorithm discards an interval and starts anew, you would instead keep a copy of that contender to use later.

  • given the sample input, the maximal intervals would look like this:

      [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] 
  • given those intervals, they would yield the following graph:

      (0) | =>0 (+6) \\ -1=>5 \\ (+2) =>7/ \\ -150=>-143 / \\ (+7) (+100) =>12 \\ / =>-43 \\ / (+24) | =>37 (0) 
  • when two edges incide on a single node (row 1 1 1 1 20), carry forward only the highest incoming value.

For each element in a row, find the maximum cost that can be obtained if we move horizontally across the row, given that we go through that element.

Eg. For the row

1 2 3 -1 -2

The maximum cost for each element obtained if we move horizontally given that we pass through that element will be

6 6 6 5 3

Explanation:

for element 3: we can move backwards horizontally touching 1 and 2. we will not move horizontally forward as the values -1 and -2, reduces the cost value.

So the maximum cost for 3 = 1 + 2 + 3 = 6

The maximum cost matrix for each of elements in a row if we move horizontally, for the input you have given in the description will be

6     6    6    5      3  
-5   -7    1    2      -148  
6     6    6    -144   100  
24    24   24   24     24

Since we can move vertically from one row to the below row, update the maximum cost for each element as follows:

cost[i][j] = cost[i][j] + cost[i-1][j]

So the final cost matrix will be :

6    6    6     5      3 
1    -1   7     7      -145 
7    5    13    -137   -45  
31   29   37    -113   -21 

Maximum value in the last row of the above matrix will be give you the required output ie 37

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM