Cómo resolver este problema de matriz (detalles en la descripción)

Primero tenga en cuenta que si se le da un segmento y se le pide que lo haga mejor haciendo un intercambio, no tiene sentido intercambiar elementos dentro del segmento, si vamos a intercambiar siempre debemos intercambiar el elemento más grande que no esté en el segmento con el más pequeño uno en el segmento (si esto hace que la suma sea más grande, por supuesto).

Ahora, ¿cómo encontramos la suma óptima?
si no hicimos ningún intercambio en absoluto, entonces esta es una submatriz de suma máxima normal que se puede resolver fácilmente usando el algoritmo de dividir y conquistar o kadanes.
si podemos hacer un intercambio, seleccionamos un elemento que no está en la submatriz y lo intercambiamos con un elemento en la submatriz, de modo que la submatriz podría estar completamente a su izquierda o completamente a la derecha (q i).

supongamos que está a su izquierda, ahora el problema se vuelve, para cada uno encuentro el subconjunto de suma máxima que termina en algún lugar antes de iy eliminamos un elemento de él.

para resolver tal problema definir
f [i] = submatriz máxima que termina en la posición i-ésima
g [i] = submatriz máxima que termina en la posición i-ésima con un elemento eliminado.

tenemos f [i] = max (f [i-1] + a [i], a [i])
y g [i] = max (f [i-1], a [i] + g [i-1])
ahora el resultado se convierte en max {a [i] + max {g [0],…, g [i-1]}

tenemos que ejecutar el algoritmo en la matriz y es inverso para manejar el otro caso.

Lo que hay que tener en cuenta aquí es que nunca tiene sentido intercambiar dos elementos dentro del segmento mismo (o ambos fuera del segmento) ya que eso no cambiaría la suma. Por lo tanto, un número tiene que estar dentro de la rebanada y otro afuera.

Recorreremos la posible posición del elemento dentro del segmento que se intercambia. Que esta posición sea i. Ahora, el elemento que se intercambia con él puede estar a su izquierda o derecha. Sin ninguna pérdida de generalidad, asuma lo último.

Para obtener la mejor suma ahora, tenemos que hacer lo siguiente:

  • Encuentre la mejor porción (quizás de longitud cero) que termine en i-1
  • Encuentre el mejor par de un segmento que comience en i + 1 y un elemento solitario fuera del segmento que proporcione la mejor suma combinada

Encontrar el mejor segmento de inicio / finalización en cada posición es un problema bien conocido. La idea es usar sumas de prefijo / sufijo. Sea B [i] = A [0] + A [1] … A [i]. Entonces es fácil ver que la suma de elementos de j a i viene dada por B [i] – B [j-1]. La suma máxima que termina en i es solo B [i] – min (B [j-1]) sobre todo j <= i.

El mejor par de elementos de corte se puede encontrar de manera similar. Además de almacenar el valor mínimo de B [j-1], también almacena el valor más grande de A que queda fuera del segmento. Es fácil ver que este es el elemento con el que queremos intercambiar el elemento en la posición i.

Solución de función privada (A como número entero ()) Como número entero ‘escriba su código en VB.NET Shop 4.0 Dim i, tamaño como número entero = A.Longitud – 1 Dim MaxSliceEnd como número entero = 0 Dim MaxSlice como número entero = A (0) Para i = 0 a tamaño MaxSliceEnd = Math.Max ​​(A (i), MaxSliceEnd + A (i)) MaxSlice = Math.Max ​​(MaxSlice, MaxSliceEnd) Siguiente retorno MaxSlice End Function