Encuentre la suma máxima de la fila superior a la inferior sin elementos diagonales adyacentes

Dada una array A[][] de N * M , la tarea es encontrar la suma máxima desde la fila superior hasta la fila inferior después de seleccionar un elemento de cada fila sin elemento diagonal adyacente.

Ejemplos: 

Entrada: A = { {1, 2, 3, 4}, {8, 7, 6, 5}, {10, 11, 12, 13} } 
Salida: 25 
Explicación: 
Elementos seleccionados para dar la suma máxima – 
Fila 0 = 4 
Fila 1 = 8 
Fila 2 = 13 
Suma = 25

Entrada: A = { {1, 6}, {5, 3}, {11, 7} } 
Salida: 17 
Explicación: 
Elementos seleccionados para dar la suma máxima – 
Fila 0 = 1 
Fila 1 = 5 
Fila 2 = 11 

Explicación: Para seleccionar cualquier elemento si hemos seleccionado A[i][j], entonces los elementos A[i+1][j+1] y A[i+1][j-1] no se pueden seleccionar. 
En el ejemplo dado, seleccione el elemento máximo de la fila superior donde 4 es el máximo en este caso, luego no se puede seleccionar el elemento A[1][2] que es 6, seleccione el elemento 8 cuyo máximo de las opciones disponibles. Del mismo modo, el elemento 11 no se puede seleccionar de la fila. Seleccione el elemento 13 para obtener la suma máxima que es 25. 
 

Enfoque ingenuo: genere todas las combinaciones de N elementos después de elegir 1 elemento de cada fila y seleccione la combinación que produce la suma máxima. 

Enfoque eficiente: la idea es utilizar el concepto de programación dinámica de forma ascendente. Comience con la fila más baja de la array dada y repita el proceso a continuación hasta que lleguemos a la fila más alta. 

  • Cree una array auxiliar de los elementos de fila más inferiores con sus índices correspondientes.
  • Ordenar la array auxiliar.
  • Iterar sobre la array auxiliar y para cada elemento encontrar el elemento máximo de la fila anterior que se agregará al elemento actual para producir la suma máxima tal que para cada A[i][j] el elemento seleccionado no sea A[i-1][ j+1] o A[i-1][j-1] .
  • Repita esto hasta llegar a la fila superior de la array dada.
  • Encuentre el elemento máximo de la fila superior para obtener la suma máxima

A continuación se muestra la implementación del enfoque anterior. 

C++

// C++ implementation to find
// maximum sum from top to bottom
// row with no adjacent diagonal elements
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum
// path sum from top to bottom row
int maxSum(vector<vector<int> >& V,
                       int n, int m){
    int ans = 0;
    for (int i = n - 2; i >= 0; --i) {
        // Create an auxiliary array of next row
        // with the element and it's position
        vector<pair<int, int> > aux;
 
        for (int j = 0; j < m; ++j) {
            aux.push_back({ V[i + 1][j],
                                    j });
        }
 
        // Sort the auxiliary array
        sort(aux.begin(), aux.end());
        reverse(aux.begin(), aux.end());
 
        // Find maximum from row above to
        // be added to the current element
        for (int j = 0; j < m; ++j) {
             
            // Find the maximum element from
            // the next row that can be added
            // to current row element
            for (int k = 0; k < m; ++k) {
                if (aux[k].second - j == 0 ||
                   abs(aux[k].second - j) > 1) {
                    V[i][j] += aux[k].first;
                    break;
                }
            }
        }
    }
 
    // Find the maximum sum
    for (int i = 0; i < m; ++i) {
        ans = max(ans, V[0][i]);
    }
    return ans;
}
 
// Driver Code
int main()
{
 
    vector<vector<int> > V{{ 1, 2, 3, 4 },
                           { 8, 7, 6, 5 },
                           { 10, 11, 12, 13 }};
    int n = V.size();
    int m = V[0].size();
 
    // Function to find maximum path
    cout << maxSum(V, n, m);
 
    return 0;
}

Java

// Java implementation to find maximum
// sum from top to bottom row with no
// adjacent diagonal elements
import java.util.*;
import java.lang.*;
import java.io.*;
 
class GFG{
 
// Function to find the maximum
// path sum from top to bottom row
static int maxSum(int[][] V,
                  int n, int m)
{
    int ans = 0;
    for(int i = n - 2; i >= 0; --i)
    {
         
        // Create an auxiliary array of next row
        // with the element and it's position
        ArrayList<int[]> aux = new ArrayList<>();
         
        for(int j = 0; j < m; ++j)
        {
            aux.add(new int[]{V[i + 1][j], j});
        }
 
        // Sort the auxiliary array
        Collections.sort(aux, (a, b) -> b[0] - a[0]);
 
        // Find maximum from row above to
        // be added to the current element
        for(int j = 0; j < m; ++j)
        {
             
            // Find the maximum element from
            // the next row that can be added
            // to current row element
            for(int k = 0; k < m; ++k)
            {
                if (aux.get(k)[1] - j == 0 ||
                    Math.abs(aux.get(k)[1] - j) > 1)
                {
                    V[i][j] += aux.get(k)[0];
                    break;
                }
            }
        }
    }
 
    // Find the maximum sum
    for(int i = 0; i < m; ++i)
    {
        ans = Math.max(ans, V[0][i]);
    }
    return ans;
}
 
// Driver code
public static void main(String[] args)
{
    int[][] V = { { 1, 2, 3, 4 },
                  { 8, 7, 6, 5 },
                  { 10, 11, 12, 13 } };
                   
    int n = V.length;
    int m = V[0].length;
     
    // Function to find maximum path
    System.out.println(maxSum(V, n, m));
}
}
 
// This code is contributed by offbeat

Python3

# Python3 implementation to find
# maximum sum from top to bottom
# row with no adjacent diagonal elements
 
# Function to find the maximum
# path sum from top to bottom row
def maxSum(V, n, m):
    ans = 0
    for i in range(n - 2, -1, -1):
         
        # Create an auxiliary array of next row
        # with the element and it's position
        aux = []
 
        for j in range(m):
            aux.append([V[i + 1][j], j])
 
        # Sort the auxiliary array
        aux = sorted(aux)
        aux = aux[::-1]
 
        # Find maximum from row above to
        # be added to the current element
        for j in range(m):
 
            # Find the maximum element from
            # the next row that can be added
            # to current row element
            for k in range(m):
                if (aux[k][1] - j == 0 or
                abs(aux[k][1] - j) > 1):
                    V[i][j] += aux[k][0]
                    break
 
    # Find the maximum sum
    for i in range(m):
        ans = max(ans, V[0][i])
 
    return ans
 
# Driver Code
if __name__ == '__main__':
 
    V=[[ 1, 2, 3, 4 ],
    [ 8, 7, 6, 5 ],
    [ 10, 11, 12, 13]]
    n = len(V)
    m = len(V[0])
 
    # Function to find maximum path
    print(maxSum(V, n, m))
 
# This code is contributed by mohit kumar 29

C#

// C# implementation to find
// maximum sum from top to bottom
// row with no adjacent diagonal elements
using System;
using System.Collections.Generic;
class GFG {
 
  // Function to find the maximum
  // path sum from top to bottom row
  static int maxSum(int[,] V, int n, int m){
    int ans = 0;
    for (int i = n - 2; i >= 0; --i) {
      // Create an auxiliary array of next row
      // with the element and it's position
      List<Tuple<int,int>> aux = new List<Tuple<int,int>>();
 
      for (int j = 0; j < m; ++j) {
        aux.Add(new Tuple<int,int>(V[i + 1, j], j));
      }
 
      // Sort the auxiliary array
      aux.Sort();
      aux.Reverse();
 
      // Find maximum from row above to
      // be added to the current element
      for (int j = 0; j < m; ++j) {
 
        // Find the maximum element from
        // the next row that can be added
        // to current row element
        for (int k = 0; k < m; ++k) {
          if (aux[k].Item2 - j == 0 ||
              Math.Abs(aux[k].Item2 - j) > 1) {
            V[i, j] += aux[k].Item1;
            break;
          }
        }
      }
    }
 
    // Find the maximum sum
    for (int i = 0; i < m; ++i) {
      ans = Math.Max(ans, V[0,i]);
    }
    return ans;
  }
 
  // Driver code
  static void Main()
  {
    int[,] V =  {{ 1, 2, 3, 4 },
                 { 8, 7, 6, 5 },
                 { 10, 11, 12, 13 }};
    int n = V.GetLength(0);
    int m = V.GetLength(1);
 
    // Function to find maximum path
    Console.WriteLine(maxSum(V, n, m));
  }
}
 
// This code is contributed by divyesh072019.

Javascript

<script>
// Javascript implementation to find
// maximum sum from top to bottom
// row with no adjacent diagonal elements
 
// Function to find the maximum
// path sum from top to bottom row
function maxSum(V, n, m){
    let ans = 0;
    for (let i = n - 2; i >= 0; --i) {
        // Create an auxiliary array of next row
        // with the element and it's position
        let aux = new Array();
 
        for (let j = 0; j < m; ++j) {
            aux.push([ V[i + 1][j], j ]);
        }
 
        // Sort the auxiliary array
        aux.sort((a, b) => a[0] - b[0]);
        aux.reverse();
 
        // Find maximum from row above to
        // be added to the current element
        for (let j = 0; j < m; ++j) {
             
            // Find the maximum element from
            // the next row that can be added
            // to current row element
            for (let k = 0; k < m; ++k) {
                if (aux[k][1] - j == 0 ||
                Math.abs(aux[k][1] - j) > 1) {
                    V[i][j] += aux[k][0];
                    break;
                }
            }
        }
    }
 
    // Find the maximum sum
    for (let i = 0; i < m; ++i) {
        ans = Math.max(ans, V[0][i]);
    }
    return ans;
}
 
// Driver Code
 
 
    let V = [[ 1, 2, 3, 4 ],
                        [ 8, 7, 6, 5 ],
                        [ 10, 11, 12, 13 ]];
    let n = V.length;
    let m = V[0].length;
 
    // Function to find maximum path
    document.write(maxSum(V, n, m));
 
    // This code is contributed by _saurabh_jaiswal
</script>
Producción: 

25

 

Complejidad de Tiempo: O(n*m 2 )
Espacio Auxiliar: O(m)

Publicación traducida automáticamente

Artículo escrito por Sanjit_Prasad 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 *