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.