Ich lösen a question von LeetCode.com. Die Frage ist so:Grund für eine solche Initialisierung von DP-Array
Sie sind ein professioneller Räuber, der plant, Häuser entlang einer Straße zu berauben. Jedes Haus hat eine bestimmte Menge Geld versteckt, die einzige Einschränkung, die Sie daran hindert, jeden von ihnen zu berauben, ist, dass benachbarte Häuser mit einem Sicherheitssystem verbunden sind und automatisch die Polizei kontaktieren, wenn in derselben Nacht zwei benachbarte Häuser einbrechen.
Geben Sie eine Liste der nicht negativen ganzen Zahlen an, die die Geldsumme jedes Hauses darstellen, und bestimmen Sie die maximale Menge an Geld, die Sie heute Nacht ausrauben können, ohne die Polizei zu alarmieren.
Nachdem er eine Weile darüber nachgedacht, ich mit der folgenden Beziehung kommen könnte, was richtig ist: Jedoch
dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
konnte ich die dp[]
Array nicht initialisiert werden. In den Lösungen wurde es wie folgt initialisiert:
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
Ist das nicht falsch? Denn wenn nums[0]>nums[1]
, dann bedeutet es nicht, das gleiche Haus zu berauben (weil wir sowohl dp[0]
als auch dp[1]
auf den gleichen Wert initialisieren?) Selbst wenn wir davon ausgehen, dass nums[1]>nums[0]
, nums[0]
und nums[1]
nicht aufeinanderfolgende Häuser sind?
Voll Code (falls erforderlich) unter:
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty())
return 0;
vector<int> dp(nums.size());
dp[0]=nums[0];
dp[1]=max(nums[0], nums[1]);
for(int i=2; i<nums.size(); i++) {
dp[i] = max(nums[i]+dp[i-2], dp[i-1]);
}
return dp[nums.size()-1];
}
};
Die Mehrheit der Community-Mitglieder genießt ihre Herbstpause, oder die Sichtbarkeit meiner Fragen wurde eingeschränkt. Ich bin mir nicht sicher, welches wahr ist. Wie ich die Zeit vermisse, in der die Leute pflegten, die Fragen zu beantworten (oder abzustimmen)! –
Denken Sie an "dp [i]" als "die maximale Menge an Geld, die Sie aus' i + 1' Häusern rauben können, ohne die Polizei zu alarmieren "und betrachten jedes' i' als einen separaten Fall. Wenn es ein Haus gibt ('i == 0'), dann kannst du nur von diesem Haus stehlen. Wenn es zwei Häuser gibt ('i == 1'), dann ist das Maximum, das du stehlen kannst, das Maximum von beiden Häusern (' nums [0] oder nums [1] '). So wie ich es gemacht habe, war "int dp [i + 1]; dp [0] = 0; dp [1] = nums [1]; ... return dp [nums.size()] 'was ich denke, macht mehr Sinn intuitiv. – 0x499602D2
@ 0x499602D2, ja, deins macht in der Tat mehr Sinn als meins! Vielen Dank! –