53. Suma máxima de subsecuencias (simple)

Ideas:

Y la subsecuencia creciente más larga y el ejemplo clásico de secuencia palindrómica más larga son similares, son programación dinámica

Ecuación de transición de estado:

dp [i] representa la mayor suma de subsecuencias antes del número actual

1) Si dp [i-1] es un número positivo, simplemente agregue nums [i] directamente, dp [i] = dp [i-1] + nums [i]

2) Si dp [i-1] es un número negativo, entonces dp [i] solo toma nums [i], lo que equivale a volver a seleccionar una nueva subsecuencia

最终dp [i] = Math.max (dp [i-1] + nums [i], nums [i])

 

Codigo 1:

class Solution {
    public int maxSubArray(int[] nums) {
	int n=nums.length;
	int[] dp=new int[n+1];
		
	dp[0]=nums[0];
	for(int i=1;i<n;i++){
	    dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);
	}
		
	int res=dp[0];
	for(int i=1;i<n;i++){
	    res=Math.max(res,dp[i]);
	}
	return res;
    }
}

 

descomponer:

1) Este es el segundo tipo de dp, el valor actual depende de todos los valores calculados previamente

Pertenece a la programación lineal

 

2) Se utilizan dos ciclos, que se pueden combinar en un ciclo.

int res=dp[0];
for(int i=1;i<n;i++){
    dp[i]=Math.max(nums[i],nums[i]+dp[i-1]);
    res=Math.max(res,dp[i]);
}

 

3) El último estado no se puede devolver directamente aquí (dp [n-1]).

La salida debe ser todo el  dp[0],, dp[1]......,dp[n - 1]  leer, lo que sea mayor

La misma situación también se aplica a la pregunta 300 de "Leguo": la subsecuencia ascendente más larga.

Supongo que te gusta

Origin blog.csdn.net/di_ko/article/details/115260814
Recomendado
Clasificación