LeetCode · Pregunta diaria · 1186. Eliminar una vez para obtener la suma máxima de subarreglos · Programación dinámica

Autor: Xiao Xun
Enlace: https://leetcode.cn/problems/maximum-subarray-sum-with-one-deletion/solutions/2321919/dong-tai-gui-hua-zhu-shi-chao-ji-xiang- x-cwvs/
Fuente: Los derechos de autor de LeetCode
pertenecen al autor. Para reimpresión comercial, comuníquese con el autor para obtener autorización, para reimpresión no comercial, indique la fuente.

tema

 

ejemplo

 

tren de pensamiento

Título -> Dada una matriz, puede eliminar como máximo un elemento arbitrario y devolver la suma máxima de los subarreglos

definir dp[tamañoarr][2]

  • dp[i][0] significa seleccionar la suma máxima del elemento actual arr[i], y dp[i][1] significa eliminar la suma máxima de un elemento.
  • Dado que el significado de la pregunta requiere que se incluya un elemento, inicialice dp[0][0] = arr[0], dp[0][1] = 0, el valor inicial debe contener un elemento, por lo que puede solo ser arr[0], inicialmente elimine un elemento y la suma debe ser 0.
  • La suma de la posición actual debe depender del estado de la posición anterior, por lo que la dirección de recursión debe ser de izquierda a derecha
  • Fórmula de recurrencia:
    • dp[i][0] = MAX(dp[i-1][0], 0) + arr[i]; Si la suma de la posición anterior es menor que 0, la posición actual es el comienzo de la sub- formación
    • dp[i][1] = MAX(dp[i-1][1] + arr[i], dp[i-1][0]); Eliminar un elemento se puede dividir en eliminar el elemento actual y eliminar el subarreglo otros Elemento, donde dp[i-1][0] significa eliminar el elemento actual, dp[i-1][1] + arr[i] significa eliminar otros elementos
  • Guardar el valor máximo de cada paso

Los comentarios del código son muy detallados.

el código


#define MAX(a, b) ((a) > (b) ? (a) : (b))
int maximumSum(int* arr, int arrSize) {
    int max = arr[0];
    int dp[arrSize][2];
    dp[0][0] = arr[0];
    dp[0][1] = 0;//初始化
    for (int i = 1; i < arrSize; i++) {
        dp[i][0] = MAX(dp[i-1][0], 0) + arr[i];//选择当前位置
        dp[i][1] = MAX(dp[i-1][1] + arr[i], dp[i-1][0]);//删除一个元素
        max = MAX(max, MAX(dp[i][0], dp[i][1]));//取每一个子数组最大值
    }
    return max;
}


作者:小迅
链接:https://leetcode.cn/problems/maximum-subarray-sum-with-one-deletion/solutions/2321919/dong-tai-gui-hua-zhu-shi-chao-ji-xiang-x-cwvs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Supongo que te gusta

Origin blog.csdn.net/m0_64560763/article/details/131410943
Recomendado
Clasificación