Ruta con valor medio máximo

Dada una array cuadrada de tamaño N*N, donde cada celda tiene asociado un costo específico. Una ruta se define como una secuencia específica de celdas que comienza en la celda superior izquierda, se mueve solo hacia la derecha o hacia abajo y termina en la celda inferior derecha. Queremos encontrar un camino con el promedio máximo sobre todos los caminos existentes. El promedio se calcula como el costo total dividido por el número de celdas visitadas en la ruta. 

Ejemplos: 

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

Una observación interesante es que los únicos movimientos permitidos son hacia abajo y hacia la derecha, necesitamos N-1 movimientos hacia abajo y N-1 movimientos hacia la derecha para llegar al destino (extremo inferior derecho). Entonces, cualquier ruta desde la esquina superior izquierda hasta la esquina inferior derecha requiere 2N – 1 celdas. En valor promedio, el denominador es fijo y solo necesitamos maximizar el numerador. Por lo tanto, básicamente necesitamos encontrar la ruta de suma máxima. Calcular la suma máxima de la ruta es un problema clásico de programación dinámica, si dp[i][j] representa la suma máxima hasta la celda (i, j) desde (0, 0), entonces en cada celda (i, j), actualizamos dp[ i][j] como se muestra a continuación,

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

Una vez que obtengamos la suma máxima de todos los caminos, dividiremos esta suma por (2N – 1) y obtendremos nuestro promedio máximo. 

Implementación:

C++

//    C/C++ program to find maximum average cost path
#include <bits/stdc++.h>
using namespace std;
 
// Maximum number of rows and/or columns
const int M = 100;
 
// method returns maximum average of all path of
// cost matrix
double maxAverageOfPath(int cost[M][M], int N)
{
    int dp[N+1][N+1];
    dp[0][0] = cost[0][0];
 
    /* Initialize first column of total cost(dp) array */
    for (int i = 1; i < N; i++)
        dp[i][0] = dp[i-1][0] + cost[i][0];
 
    /* Initialize first row of dp array */
    for (int j = 1; j < N; j++)
        dp[0][j] = dp[0][j-1] + cost[0][j];
 
    /* Construct rest of the dp array */
    for (int i = 1; i < N; i++)
        for (int 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 (double)dp[N-1][N-1] / (2*N-1);
}
 
/* Driver program to test above functions */
int main()
{
    int cost[M][M] = { {1, 2, 3},
        {6, 5, 4},
        {7, 3, 9}
    };
    printf("%f", maxAverageOfPath(cost, 3));
    return 0;
}

Java

// JAVA Code for Path with maximum average
// value
class GFG {
     
    // method returns maximum average of all
    // path of cost matrix
    public static double maxAverageOfPath(int cost[][],
                                               int N)
    {
        int dp[][] = new int[N+1][N+1];
        dp[0][0] = cost[0][0];
      
        /* Initialize first column of total cost(dp)
           array */
        for (int i = 1; i < N; i++)
            dp[i][0] = dp[i-1][0] + cost[i][0];
      
        /* Initialize first row of dp array */
        for (int j = 1; j < N; j++)
            dp[0][j] = dp[0][j-1] + cost[0][j];
      
        /* Construct rest of the dp array */
        for (int i = 1; i < N; i++)
            for (int 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
        return (double)dp[N-1][N-1] / (2 * N - 1);
    }
     
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int cost[][] = {{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 columns
M = 100
 
# method returns maximum average of
# all path of cost matrix
def maxAverageOfPath(cost, N):
     
    dp = [[0 for i in range(N + 1)] for j in range(N + 1)]
    dp[0][0] = cost[0][0]
 
    # Initialize first column of total cost(dp) array
    for i in range(1, N):
        dp[i][0] = dp[i - 1][0] + cost[i][0]
 
    # Initialize first row of dp array
    for j in range(1, N):
        dp[0][j] = dp[0][j - 1] + cost[0][j]
 
    # Construct rest of the dp array
    for i in range(1, N):
        for j in range(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
    return dp[N - 1][N - 1] / (2 * N - 1)
 
# Driver program to test above function
cost = [[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
// value
using System;
class GFG {
     
    // method returns maximum average of all
    // path of cost matrix
    public static double maxAverageOfPath(int [,]cost,
                                               int N)
    {
        int [,]dp = new int[N+1,N+1];
        dp[0,0] = cost[0,0];
     
        /* Initialize first column of total cost(dp)
           array */
        for (int i = 1; i < N; i++)
            dp[i, 0] = dp[i - 1,0] + cost[i, 0];
     
        /* Initialize first row of dp array */
        for (int j = 1; j < N; j++)
            dp[0, j] = dp[0,j - 1] + cost[0, j];
     
        /* Construct rest of the dp array */
        for (int i = 1; i < N; i++)
            for (int 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
        return (double)dp[N - 1, N - 1] / (2 * N - 1);
    }
     
    // Driver Code
    public static void Main()
    {
        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
function maxAverageOfPath($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) ) ;
             
    echo maxAverageOfPath($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
    function maxAverageOfPath(cost, N)
    {
        let dp = new Array(N+1);
        for (let i = 0; i < N + 1; i++)
        {
            dp[i] = new Array(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
        return dp[N-1][N-1] / (2 * N - 1);
    }
     
    let cost = [[1, 2, 3],
                [6, 5, 4],
                [7, 3, 9]];
                   
      document.write(maxAverageOfPath(cost, 3));
 
</script>
Producción

5.200000

Complejidad de tiempo : O(N 2 ) para entrada dada N

Espacio auxiliar: O(N 2 ) para entrada dada N.

Este artículo es una contribución de Utkarsh Trivedi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *