Ideen:
Und die am längsten zunehmende Teilsequenz und die längste palindromische Sequenz klassisches Beispiel ähnlich, sie sind dynamische Programmierung
Zustandsübergangsgleichung:
dp [i] repräsentiert die größte Teilsequenzsumme vor der aktuellen Zahl
1) Wenn dp [i-1] eine positive Zahl ist, addiere einfach nums [i] direkt, dp [i] = dp [i-1] + nums [i]
2) Wenn dp [i-1] eine negative Zahl ist, nimmt dp [i] nur Zahlen [i] an, was einer erneuten Auswahl einer neuen Teilsequenz entspricht
最终 dp [i] = Math.max (dp [i-1] + nums [i], nums [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;
}
}
abbauen:
1) Dies ist der zweite Typ von dp. Der aktuelle Wert hängt von allen zuvor berechneten Werten ab
Gehört zur linearen Programmierung
2) Es werden zwei Zyklen verwendet, die zu einem Zyklus kombiniert werden können
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) Der letzte Zustand kann hier nicht direkt zurückgegeben werden (dp [n-1]).
Die Ausgabe sollte alle dp[0]
, dp[1]
......,dp[n - 1]
durchgelesen sein, je nachdem, welcher Wert größer ist
Die gleiche Situation gilt auch für "Leguo" -Frage 300: die längste aufsteigende Teilsequenz.