📜  查找从左下角到右上角的最大成本路径

📅  最后修改于: 2021-04-27 21:04:35             🧑  作者: Mango

给定一个二维网格,其每个像元都包含整数成本,它代表穿越该像元的成本。任务是找到从左下角到右上角的最大成本路径。

注意:仅使用向上和向右移动

例子:

Input : mat[][] = {{20, -10, 0}, 
                   {1, 5, 10}, 
                   {1, 2, 3}}
Output : 18
(2, 0) ==> (2, 1) ==> (1, 1) ==> (1, 2) ==> (0, 2)  
cost for this path is (1+2+5+10+0) = 18

Input : mat[][] = {{1, -2, -3}, 
                   {1, 15, 10},
                   {1, -2, 3}}
Output : 24

先决条件:最小成本路径,允许向左,向右,向下和向上移动

方法:想法是维护一个单独的阵列,以使用队列存储所有单元的最大成本。对于每个单元格,检查到达该单元格的当前成本是否大于先前的成本。如果先前的成本最低,则使用当前成本更新单元格。

下面是上述方法的实现:

C++
// C++ program to find maximum cost to reach 
// top right corner from bottom left corner
#include 
using namespace std; 
  
#define ROW 3
#define COL 3 
  
// To store matrix cell coordinates 
struct Point 
{ 
    int x; 
    int y; 
}; 
  
// Check whether given cell (row, col) 
// is a valid cell or not. 
bool isValid(Point p) 
{ 
    // Return true if row number and column number 
    // is in range 
    return (p.x >=0) && (p.y  q; 
      
    q.push(src); // Enqueue source cell 
  
    // Do a BFS starting from source cell 
    // on the allowed direction
    while (!q.empty()) 
    { 
        Point curr = q.front();
        q.pop(); 
      
        // Find up point
        Point up = {curr.x-1, curr.y};
              
        // if adjacent cell is valid, enqueue it. 
        if (isValid(up)) 
        { 
            max_val[up.x][up.y] = max(max_val[up.x][up.y], 
                 mat[up.x][up.y] + max_val[curr.x][curr.y]);
            q.push(up);
        }
          
        // Find right point    
        Point right = {curr.x, curr.y+1};
      
        if(isValid(right)) 
        { 
            max_val[right.x][right.y] = max(max_val[right.x][right.y],
                mat[right.x][right.y] + max_val[curr.x][curr.y]);
            q.push(right);
        }
          
    } 
      
    // Return the required answer
    return max_val[0][COL-1]; 
} 
  
// Driver code
int main() 
{ 
    int mat[ROW][COL] = { {20, -10, 0},
                          {1, 5, 10},
                          {1, 2, 3},}; 
  
    std::cout<<"Given matrix is "<


Java
// Java program to find maximum cost to reach 
// top right corner from bottom left corner
import java.util.*;
class GFG
{
static int ROW = 3;
static int COL = 3;
  
// To store matrix cell coordinates 
static class Point 
{ 
    int x; 
    int y; 
  
    public Point(int x, int y) 
    {
        this.x = x;
        this.y = y;
    } 
} 
  
// Check whether given cell (row, col) 
// is a valid cell or not. 
static boolean isValid(Point p) 
{ 
    // Return true if row number and column number 
    // is in range 
    return (p.x >= 0) && (p.y < COL); 
} 
  
// Function to find maximum cost to reach 
// top right corner from bottom left corner
static int find_max_cost(int mat[][]) 
{ 
    int [][]max_val = new int[ROW][COL]; 
    max_val[ROW - 1][0] = mat[ROW - 1][0]; 
      
    // Starting point 
    Point src = new Point(ROW - 1, 0);
  
    // Create a queue for traversal 
    Queue q = new LinkedList<>(); 
      
    q.add(src); // Enqueue source cell 
  
    // Do a BFS starting from source cell 
    // on the allowed direction
    while (!q.isEmpty()) 
    { 
        Point curr = q.peek();
        q.remove(); 
      
        // Find up point
        Point up = new Point(curr.x - 1, curr.y);
              
        // if adjacent cell is valid, enqueue it. 
        if (isValid(up)) 
        { 
            max_val[up.x][up.y] = Math.max(max_val[up.x][up.y], 
                mat[up.x][up.y] + max_val[curr.x][curr.y]);
            q.add(up);
        }
          
        // Find right point 
        Point right = new Point(curr.x, curr.y + 1);
      
        if(isValid(right)) 
        { 
            max_val[right.x][right.y] = Math.max(max_val[right.x][right.y],
                mat[right.x][right.y] + max_val[curr.x][curr.y]);
            q.add(right);
        }
    } 
      
    // Return the required answer
    return max_val[0][COL - 1]; 
} 
  
// Driver code
public static void main(String[] args) 
{
    int mat[][] = {{20, -10, 0},
                   {1, 5, 10},
                   {1, 2, 3}}; 
  
    System.out.println("Given matrix is ");
  
    for(int i = 0 ; i < ROW; ++i)
    {
        for(int j = 0; j < COL; ++j)
            System.out.print(mat[i][j] + " ");
  
        System.out.println();
    }
      
    System.out.print("Maximum cost is " + 
                     find_max_cost(mat)); 
}
}
  
// This code is contributed by PrinciRaj1992


Python
# Python3 program to find maximum cost to reach
# top right corner from bottom left corner
from collections import deque as queue
  
ROW = 3
COL = 3
  
# Check whether given cell (row, col)
# is a valid cell or not.
def isValid(p):
      
    # Return true if row number and column number
    # is in range
    return (p[0] >= 0) and (p[1] < COL)
  
# Function to find maximum cost to reach
# top right corner from bottom left corner
def find_max_cost(mat):
    max_val = [[0 for i in range(COL)] for i in range(ROW)]
  
    max_val[ROW - 1][0] = mat[ROW - 1][0]
  
    # Starting po
    src = [ROW - 1, 0]
  
    # Create a queue for traversal
    q = queue()
  
    q.appendleft(src) # Enqueue source cell
  
    # Do a BFS starting from source cell
    # on the allowed direction
    while (len(q) > 0):
        curr = q.pop()
  
        # Find up point
        up = [curr[0] - 1, curr[1]]
  
        # if adjacent cell is valid, enqueue it.
        if (isValid(up)):
            max_val[up[0]][up[1]] = max(max_val[up[0]][up[1]],mat[up[0]][up[1]] + max_val[curr[0]][curr[1]])
            q.appendleft(up)
  
  
        # Find right po
        right = [curr[0], curr[1] + 1]
  
        if(isValid(right)):
            max_val[right[0]][right[1]] = max(max_val[right[0]][right[1]],mat[right[0]][right[1]] + max_val[curr[0]][curr[1]])
            q.appendleft(right)
  
  
    # Return the required answer
    return max_val[0][COL - 1]
  
# Driver code
mat = [[20, -10, 0],
    [1, 5, 10],
    [1, 2, 3]]
  
print("Given matrix is ")
  
for i in range(ROW):
    for j in range(COL):
        print(mat[i][j],end=" ")
    print()
  
print("Maximum cost is ", find_max_cost(mat))
  
# This code is contributed by mohit kumar 29


C#
// C# program to find maximum cost to reach 
// top right corner from bottom left corner
using System;
using System.Collections.Generic;
  
class GFG
{
      
static int ROW = 3;
static int COL = 3;
  
// To store matrix cell coordinates 
public class Point 
{ 
    public int x; 
    public int y; 
  
    public Point(int x, int y) 
    {
        this.x = x;
        this.y = y;
    } 
} 
  
// Check whether given cell (row, col) 
// is a valid cell or not. 
static Boolean isValid(Point p) 
{ 
    // Return true if row number and 
    // column number is in range 
    return (p.x >= 0) && (p.y < COL); 
} 
  
// Function to find maximum cost to reach 
// top right corner from bottom left corner
static int find_max_cost(int [,]mat) 
{ 
    int [,]max_val = new int[ROW,COL]; 
    max_val[ROW - 1, 0] = mat[ROW - 1, 0]; 
       
    // Starting point 
    Point src = new Point(ROW - 1, 0);
  
    // Create a queue for traversal 
    Queue q = new Queue(); 
      
    q.Enqueue(src); // Enqueue source cell 
  
    // Do a BFS starting from source cell 
    // on the allowed direction
    while (q.Count != 0) 
    { 
        Point curr = q.Peek();
        q.Dequeue(); 
      
        // Find up point
        Point up = new Point(curr.x - 1, curr.y);
              
        // if adjacent cell is valid, enqueue it. 
        if (isValid(up)) 
        { 
            max_val[up.x, up.y] = Math.Max(max_val[up.x, up.y], 
                mat[up.x, up.y] + max_val[curr.x, curr.y]);
            q.Enqueue(up);
        }
          
        // Find right point 
        Point right = new Point(curr.x, 
                                curr.y + 1);
      
        if(isValid(right)) 
        { 
            max_val[right.x, right.y] = Math.Max(max_val[right.x, right.y],
                mat[right.x, right.y] + max_val[curr.x, curr.y]);
            q.Enqueue(right);
        }
    } 
      
    // Return the required answer
    return max_val[0, COL - 1]; 
} 
  
// Driver code
public static void Main(String[] args) 
{
    int [,]mat = {{20, -10, 0},
                  {1, 5, 10},
                  {1, 2, 3}}; 
  
    Console.WriteLine("Given matrix is ");
  
    for(int i = 0 ; i < ROW; ++i)
    {
        for(int j = 0; j < COL; ++j)
            Console.Write(mat[i, j] + " ");
  
        Console.WriteLine();
    }
      
    Console.Write("Maximum cost is " + 
                  find_max_cost(mat)); 
}
}
  
// This code is contributed by Princi Singh


输出:
Given matrix is 
20 -10 0 
1 5 10 
1 2 3 
Maximum cost is 18