Ideias:
E a subsequência crescente mais longa e o exemplo clássico de sequência palíndrômica mais longa semelhantes, eles são de programação dinâmica
Equação de transição de estado:
dp [i] representa a maior soma subsequente antes do número atual
1) Se dp [i-1] for um número positivo, basta adicionar nums [i] diretamente, dp [i] = dp [i-1] + nums [i]
2) Se dp [i-1] é um número negativo, então dp [i] leva apenas nums [i], que é equivalente a selecionar novamente uma nova subsequência
最终dp [i] = Math.max (dp [i-1] + nums [i], nums [i])
Código 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;
}
}
discriminação:
1) Este é o segundo tipo de dp, o valor atual depende de todos os valores calculados anteriormente
Pertence à programação linear
2) Dois ciclos são usados, os quais podem ser combinados em um 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) O último estado não pode ser retornado diretamente aqui (dp [n-1]).
Saída deve ser tudo o dp[0]
,, dp[1]
......,dp[n - 1]
ler, o que for maior
A mesma situação também se aplica à questão 300 de "Leguo": a subsequência ascendente mais longa.