Saltar al contenido

Maximizar la suma del producto de los elementos vecinos del elemento eliminado de la matriz

Maximizar la suma del producto de los elementos vecinos del elemento eliminado de la matriz

Dada una matriz A[] el tamaño norte, la tarea es encontrar el número máximo posible de puntos para esta matriz. La puntuación de una matriz se calcula realizando las siguientes operaciones en la matriz hasta que el tamaño de la matriz sea mayor que 2:

  • Seleccionar un índice I así que eso 1 .
  • añadir A[i-1] * A[i+1] en la partitura
  • Remoto A[i] de la matriz.

Ejemplo:

Entrada: A[] = {1, 2, 3, 4}
Producción: 12
Explicación:
En la primera actividad, seleccione i = 2. El número de puntos aumenta en A. elevado[1] * A[3] = 2 * 4 = 8. La nueva matriz después de eliminar A[2] será {1, 2, 4}.
En el primer proceso, seleccione i = 1. El número de puntos aumenta en A. elevado[0] * A[2] = 1 * 4 = 4. La nueva matriz después de eliminar A[2] será {1, 4}.
Dado que N <= 2, no son posibles más operaciones.
La puntuación total es 8 + 4 = 12, que es el máximo de todas las opciones posibles.

Entrada: {1, 55}
Producción: 0
Explicación: No es posible realizar movimientos válidos.

Acercarse: El problema dado se puede resolver con programación dinámica basada en las siguientes observaciones:

  • Considere una matriz 2D, digamos dp[][] Dónde dp[i][j] representa el número máximo posible de puntos en el subarreglo del índice I para J.
  • Iterar sobre todas las submatrices de longitudes len Lanzamientos [1, N-1] en orden ascendente donde I denota el comienzo y J denota el índice final del subarreglo de la longitud actual.
  • Se puede observar que para un subarreglo I para J, el índice del último elemento restante k, excepto I y J puede estar en el rango [i+1, j-1]. Así que itera sobre todos los valores posibles de k. Por lo tanto, la relación DP se puede especificar de la siguiente manera:

dp[i][j] = max (dp[i][j], dp[i][k] + dp[k][j] + A[i]*A[j]) para todos los k en el rango [i+1, j-1]

  • La respuesta final sera dp[0][N-1].

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

C ++

#include <bits/stdc++.h>

using namespace std;

 

int dp[101][101];

 

int maxMergingScore(int A[], int N)

{

    

    

    for (int len = 1; len < N; ++len) {

 

        

        

        

        for (int i = 0; i + len < N; ++i) {

 

            

            

            int j = i + len;

 

            

            dp[i][j] = 0;

 

            

            

            for (int k = i + 1; k < j; ++k) {

                dp[i][j] = max(

                    dp[i][j],

                    dp[i][k] + dp[k][j]

                        + A[i] * A[j]);

            }

        }

    }

 

    

    return dp[0][N - 1];

}

 

int main()

{

    int N = 4;

    int A[] = { 1, 2, 3, 4 };

 

    

    cout << maxMergingScore(A, N) << endl;

 

    N = 2;

    int B[] = { 1, 55 };

 

    

    cout << maxMergingScore(B, N) << endl;

 

    return 0;

}

Complejidad del tiempo: A3)
Sala auxiliar: A2)

¡Atención lectores! No dejes de aprender ahora. Obtenga todos los conceptos principales de DSA con el Curso de autoaprendizaje de DSA a un precio asequible para los estudiantes y conviértase en apto para la industria. Para completar su preparación desde el aprendizaje de un idioma hasta DS Algo y mucho más, lea Toma el curso de preparación para entrevistas.

En caso de que quieras participar Clases en vivo con expertos, consulte Cursos en vivo de DSA para profesionales y Programación de competencias en vivo para estudiantes.

Source link

TECHNOLOGY