Path with maximum average value

Given a square matrix of size N*N, where each cell is associated with a specific cost. A path is defined as a specific sequence of cells that starts from the top-left cell move only right or down and ends on bottom right cell. We want to find a path with the maximum average over all existing paths. Average is computed as total cost divided by the number of cells visited in the path.
Examples:
Input : Matrix = [1, 2, 3
                  4, 5, 6
                  7, 8, 9]
Output : 5.8
Path with maximum average is, 1 -> 4 -> 7 -> 8 -> 9
Sum of the path is 29 and average is 29/5 = 5.8
One interesting observation is, the only allowed moves are down and right, we need N-1 down moves and N-1 right moves to reach the destination (bottom rightmost). So any path from top left corner to bottom right corner requires 2N – 1 cells. In average value, the denominator is fixed and we need to just maximize numerator. Therefore we basically need to find the maximum sum path. Calculating maximum sum of path is a classic dynamic programming problem, if dp[i][j] represents maximum sum till cell (i, j) from (0, 0) then at each cell (i, j), we update dp[i][j] as below,
for all i, 1 <= i <= N dp[i][0] = dp[i-1][0] + cost[i][0]; for all j, 1 <= j <= N dp[0][j] = dp[0][j-1] + cost[0][j]; otherwise dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + cost[i][j];
Once we get maximum sum of all paths we will divide this sum by (2N – 1) and we will get our maximum average.
Implementation:
C++
| //C/C++ program to find maximum average cost path#include <bits/stdc++.h>usingnamespacestd;// Maximum number of rows and/or columnsconstintM = 100;// method returns maximum average of all path of// cost matrixdoublemaxAverageOfPath(intcost[M][M], intN){    intdp[N+1][N+1];    dp[0][0] = cost[0][0];    /* Initialize first column of total cost(dp) array */    for(inti = 1; i < N; i++)        dp[i][0] = dp[i-1][0] + cost[i][0];    /* Initialize first row of dp array */    for(intj = 1; j < N; j++)        dp[0][j] = dp[0][j-1] + cost[0][j];    /* Construct rest of the dp array */    for(inti = 1; i < N; i++)        for(intj = 1; j <= N; j++)            dp[i][j] = max(dp[i-1][j],                          dp[i][j-1]) + cost[i][j];    // divide maximum sum by constant path    // length : (2N - 1) for getting average    return(double)dp[N-1][N-1] / (2*N-1);}/* Driver program to test above functions */intmain(){    intcost[M][M] = { {1, 2, 3},        {6, 5, 4},        {7, 3, 9}    };    printf("%f", maxAverageOfPath(cost, 3));    return0;} | 
Java
| // JAVA Code for Path with maximum average// valueimportjava.io.*;classGFG {        // method returns maximum average of all    // path of cost matrix    publicstaticdoublemaxAverageOfPath(intcost[][],                                               intN)    {        intdp[][] = newint[N+1][N+1];        dp[0][0] = cost[0][0];             /* Initialize first column of total cost(dp)           array */        for(inti = 1; i < N; i++)            dp[i][0] = dp[i-1][0] + cost[i][0];             /* Initialize first row of dp array */        for(intj = 1; j < N; j++)            dp[0][j] = dp[0][j-1] + cost[0][j];             /* Construct rest of the dp array */        for(inti = 1; i < N; i++)            for(intj = 1; j < N; j++)                dp[i][j] = Math.max(dp[i-1][j],                           dp[i][j-1]) + cost[i][j];             // divide maximum sum by constant path        // length : (2N - 1) for getting average        return(double)dp[N-1][N-1] / (2* N - 1);    }        /* Driver program to test above function */    publicstaticvoidmain(String[] args)     {        intcost[][] = {{1, 2, 3},                        {6, 5, 4},                        {7, 3, 9}};                        System.out.println(maxAverageOfPath(cost, 3));    }}// This code is contributed by Arnav Kr. Mandal. | 
Python3
| # Python program to find # maximum average cost path# Maximum number of rows # and/or columnsM =100# method returns maximum average of # all path of cost matrixdefmaxAverageOfPath(cost, N):        dp =[[0fori inrange(N +1)] forj inrange(N +1)]    dp[0][0] =cost[0][0]    # Initialize first column of total cost(dp) array    fori inrange(1, N):        dp[i][0] =dp[i -1][0] +cost[i][0]    # Initialize first row of dp array    forj inrange(1, N):        dp[0][j] =dp[0][j -1] +cost[0][j]    # Construct rest of the dp array    fori inrange(1, N):        forj inrange(1, N):            dp[i][j] =max(dp[i -1][j],                        dp[i][j -1]) +cost[i][j]    # divide maximum sum by constant path    # length : (2N - 1) for getting average    returndp[N -1][N -1] /(2*N -1)# Driver program to test above functioncost =[[1, 2, 3],        [6, 5, 4],        [7, 3, 9]]print(maxAverageOfPath(cost, 3))# This code is contributed by Soumen Ghosh. | 
C#
| // C# Code for Path with maximum average// valueusingSystem;classGFG {        // method returns maximum average of all    // path of cost matrix    publicstaticdoublemaxAverageOfPath(int[,]cost,                                               intN)    {        int[,]dp = newint[N+1,N+1];        dp[0,0] = cost[0,0];            /* Initialize first column of total cost(dp)           array */        for(inti = 1; i < N; i++)            dp[i, 0] = dp[i - 1,0] + cost[i, 0];            /* Initialize first row of dp array */        for(intj = 1; j < N; j++)            dp[0, j] = dp[0,j - 1] + cost[0, j];            /* Construct rest of the dp array */        for(inti = 1; i < N; i++)            for(intj = 1; j < N; j++)                dp[i, j] = Math.Max(dp[i - 1, j],                        dp[i,j - 1]) + cost[i, j];            // divide maximum sum by constant path        // length : (2N - 1) for getting average        return(double)dp[N - 1, N - 1] / (2 * N - 1);    }        // Driver Code    publicstaticvoidMain()     {        int[,]cost = {{1, 2, 3},                       {6, 5, 4},                       {7, 3, 9}};                        Console.Write(maxAverageOfPath(cost, 3));    }}// This code is contributed by nitin mittal. | 
PHP
| <?php// Php program to find maximum average cost path // method returns maximum average of all path of // cost matrix functionmaxAverageOfPath($cost, $N) {     $dp= array(array()) ;    $dp[0][0] = $cost[0][0];     /* Initialize first column of total cost(dp) array */    for($i= 1; $i< $N; $i++)         $dp[$i][0] = $dp[$i-1][0] + $cost[$i][0];     /* Initialize first row of dp array */    for($j= 1; $j< $N; $j++)         $dp[0][$j] = $dp[0][$j-1] + $cost[0][$j];     /* Construct rest of the dp array */    for($i= 1; $i< $N; $i++)     {        for($j= 1; $j<= $N; $j++)             $dp[$i][$j] = max($dp[$i-1][$j],$dp[$i][$j-1]) + $cost[$i][$j];     }    // divide maximum sum by constant path     // length : (2N - 1) for getting average     return$dp[$N-1][$N-1] / (2*$N-1); }     // Driver code    $cost= array(array(1, 2, 3),             array( 6, 5, 4),             array(7, 3, 9) ) ;                echomaxAverageOfPath($cost, 3) ;     // This code is contributed by Ryuga?> | 
Javascript
| <script>    // JavaScript Code for Path with maximum average value        // method returns maximum average of all    // path of cost matrix    functionmaxAverageOfPath(cost, N)    {        let dp = newArray(N+1);        for(let i = 0; i < N + 1; i++)        {            dp[i] = newArray(N + 1);            for(let j = 0; j < N + 1; j++)            {                dp[i][j] = 0;            }        }        dp[0][0] = cost[0][0];               /* Initialize first column of total cost(dp)           array */        for(let i = 1; i < N; i++)            dp[i][0] = dp[i-1][0] + cost[i][0];               /* Initialize first row of dp array */        for(let j = 1; j < N; j++)            dp[0][j] = dp[0][j-1] + cost[0][j];               /* Construct rest of the dp array */        for(let i = 1; i < N; i++)            for(let j = 1; j < N; j++)                dp[i][j] = Math.max(dp[i-1][j],                           dp[i][j-1]) + cost[i][j];               // divide maximum sum by constant path        // length : (2N - 1) for getting average        returndp[N-1][N-1] / (2 * N - 1);    }        let cost = [[1, 2, 3],                [6, 5, 4],                [7, 3, 9]];                        document.write(maxAverageOfPath(cost, 3));</script> | 
5.200000
Time complexity: O(N2) for  given input N
Auxiliary Space: O(N2) for given input N.
Method – 2: Without using Extra N*N space
We can use input cost array as a dp to store the ans. so this way we don’t need an extra dp array or no that extra space.\
One observation is that the only allowed moves are down and right, we need N-1 down moves and N-1 right moves to reach the destination (bottom rightmost). So any path from top left corner to bottom right corner requires 2N – 1 cell. In average value, the denominator is fixed and we need to just maximize numerator. Therefore we basically need to find the maximum sum path. Calculating maximum sum of path is a classic dynamic programming problem, also we don’t need any prev cost[i][j] value after calculating dp[i][j] so we can modifies the cost[i][j] value such that we don’t need extra space for dp[i][j].
for all i, 1 <= i < N cost[i][0] = cost[i-1][0] + cost[i][0]; for all j, 1 <= j < N cost[0][j] = cost[0][j-1] + cost[0][j]; otherwise cost[i][j] = max(cost[i-1][j], cost[i][j-1]) + cost[i][j];
Below is the implementation of the above approach:
C++
| // C++ program to find maximum average cost path#include <bits/stdc++.h>usingnamespacestd;// Method returns maximum average of all path of cost matrixdoublemaxAverageOfPath(vector<vector<int>>cost){    intN = cost.size();    // Initialize first column of total cost array    for(inti = 1; i < N; i++)        cost[i][0] = cost[i][0] + cost[i - 1][0];    // Initialize first row of array    for(intj = 1; j < N; j++)        cost[0][j] = cost[0][j - 1] + cost[0][j];    // Construct rest of the array    for(inti = 1; i < N; i++)        for(intj = 1; j <= N; j++)            cost[i][j] = max(cost[i - 1][j], cost[i][j - 1]) + cost[i][j];    // divide maximum sum by constant path    // length : (2N - 1) for getting average    return(double)cost[N - 1][N - 1] / (2 * N - 1);}// Driver programintmain(){    vector<vector<int>> cost = {{1, 2, 3},        {6, 5, 4},        {7, 3, 9}    };    cout << maxAverageOfPath(cost);    return0;} | 
Java
| // Java program to find maximum average cost pathimportjava.io.*;classGFG {  // Method returns maximum average of all path of cost  // matrix  staticdoublemaxAverageOfPath(int[][] cost)  {    intN = cost.length;    // Initialize first column of total cost array    for(inti = 1; i < N; i++)      cost[i][0] = cost[i][0] + cost[i - 1][0];    // Initialize first row of array    for(intj = 1; j < N; j++)      cost[0][j] = cost[0][j - 1] + cost[0][j];    // Construct rest of the array    for(inti = 1; i < N; i++)      for(intj = 1; j < N; j++)        cost[i][j] = Math.max(cost[i - 1][j],                              cost[i][j - 1])        + cost[i][j];    // divide maximum sum by constant path    // length : (2N - 1) for getting average    return(double)cost[N - 1][N - 1] / (2* N - 1);  }  // Driver program  publicstaticvoidmain(String[] args)  {    int[][] cost      = { { 1, 2, 3}, { 6, 5, 4}, { 7, 3, 9} };    System.out.println(maxAverageOfPath(cost));  }}// This code is contributed by karandeep1234 | 
Python3
| # Python program to find maximum average cost pathfromtyping importListdefmaxAverageOfPath(cost: List[List[int]]) -> float:    N =len(cost)    # Initialize first column of total cost array    fori inrange(1, N):        cost[i][0] =cost[i][0] +cost[i -1][0]    # Initialize first row of array    forj inrange(1, N):        cost[0][j] =cost[0][j -1] +cost[0][j]    # Construct rest of the array    fori inrange(1, N):        forj inrange(1, N):            cost[i][j] =max(cost[i -1][j], cost[i][j -1]) +cost[i][j]    # divide maximum sum by constant path    # length : (2N - 1) for getting average    returncost[N -1][N -1] /(2*N -1)# Driver programdefmain():    cost =[[1, 2, 3],            [6, 5, 4],            [7, 3, 9]]    print(maxAverageOfPath(cost))if__name__ =='__main__':    main() | 
C#
| // C# program to find maximum average cost pathusingSystem;classGFG {  // Method returns maximum average of all path of cost  // matrix  staticdoublemaxAverageOfPath(int[, ] cost)  {    intN = cost.GetLength(0);    // Initialize first column of total cost array    for(inti = 1; i < N; i++)      cost[i, 0] = cost[i, 0] + cost[i - 1, 0];    // Initialize first row of array    for(intj = 1; j < N; j++)      cost[0, j] = cost[0, j - 1] + cost[0, j];    // Construct rest of the array    for(inti = 1; i < N; i++)      for(intj = 1; j < N; j++)        cost[i, j] = Math.Max(cost[i - 1, j],                              cost[i, j - 1])        + cost[i, j];    // divide maximum sum by constant path    // length : (2N - 1) for getting average    return(double)cost[N - 1, N - 1] / (2 * N - 1);  }  // Driver program  staticvoidMain(string[] args)  {    int[, ] cost      = { { 1, 2, 3 }, { 6, 5, 4 }, { 7, 3, 9 } };    Console.WriteLine(maxAverageOfPath(cost));  }}// This code is contributed by karandeep1234 | 
Javascript
| // Method returns maximum average of all path of cost matrixfunctionmaxAverageOfPath(cost){    let N = cost.length;    // Initialize first column of total cost array    for(let i = 1; i < N; i++)        cost[i][0] = cost[i][0] + cost[i - 1][0];    // Initialize first row of array    for(let j = 1; j < N; j++)        cost[0][j] = cost[0][j - 1] + cost[0][j];    // Construct rest of the array    for(let i = 1; i < N; i++)        for(let j = 1; j <= N; j++)            cost[i][j] = Math.max(cost[i - 1][j], cost[i][j - 1]) + cost[i][j];    // divide maximum sum by constant path    // length : (2N - 1) for getting average    return(cost[N - 1][N - 1]) / (2.0 * N - 1);}// Driver programlet cost = [[1, 2, 3],        [6, 5, 4],        [7, 3, 9]];console.log(maxAverageOfPath(cost))// This code is contributed by karandeep1234. | 
5.2
Time Complexity: O(N*N)
Auxiliary Space: O(1)
This article is contributed by Utkarsh Trivedi. If you like zambiatek and would like to contribute, you can also write an article using write.zambiatek.com or mail your article to review-team@zambiatek.com. See your article appearing on the zambiatek main page and help other Geeks.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!
 
				 
					


