Idées:
Et la plus longue sous-séquence croissante et la plus longue séquence palindromique exemple classique similaire, il s'agit d'une programmation dynamique
Équation de transition d'état:
dp [i] représente la plus grande somme de sous-séquences avant le nombre courant
1) Si dp [i-1] est un nombre positif, ajoutez simplement nums [i] directement, dp [i] = dp [i-1] + nums [i]
2) Si dp [i-1] est un nombre négatif, alors dp [i] ne prend que nums [i], ce qui équivaut à resélectionner une nouvelle sous-séquence
最终dp [i] = Math.max (dp [i-1] + nombres [i], nombres [i])
Code 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;
}
}
panne:
1) C'est le deuxième type de dp, la valeur actuelle dépend de toutes les valeurs calculées précédemment
Appartiennent à la programmation linéaire
2) Deux cycles sont utilisés, qui peuvent être combinés en un seul cycle
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) Le dernier état ne peut pas être renvoyé directement ici (dp [n-1]).
La production devrait être d' autant dp[0]
,, dp[1]
......,dp[n - 1]
lire, selon le plus élevé
La même situation s'applique également à la question 300 "Leguo": la sous-séquence ascendante la plus longue.