53. Soma de subsequência máxima (simples)

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.

Acho que você gosta

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