53. Maximale Teilsequenzsumme (einfach)

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.

Ich denke du magst

Origin blog.csdn.net/di_ko/article/details/115260814
Empfohlen
Rangfolge