LeetCode.comからa questionを解決しています。質問は次のようなものです:このようなDPアレイの初期化の理由
あなたは通りに沿って家を奪うためにプロの強盗を計画しています。それぞれの家には一定の金額が隠されています。隣接する家にはセキュリティシステムが接続されており、隣の2つの家が同じ夜に壊れた場合、自動的に警察に連絡します。
各家の金額を表す負でない整数のリストが与えられている場合、警察に警告することなく、今夜奪うことのできる最大金額を決定します。
しばらくそれについて考えた後、私は正しいと次の関係、を考え出すことができます:
dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
しかし、私はdp[]
配列を初期化できませんでした。ソリューションでは、このように初期化されました:
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
これは間違っていませんか? nums[0]>nums[1]
なら、それは同じ家を奪うことを意味しないからです(同じ値にdp[0]
とdp[1]
を初期化するからです)。nums[1]>nums[0]
と仮定しても、nums[0]
とnums[1]
は連続した家ではありませんか?
全コード(必要な場合)以下である:「警察を警告せずにi+1
家からすることができます奪うお金の最大量」
dp[i]
の溶液与えられたと思うで
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];
}
};
コミュニティメンバーの過半数が秋休みを楽しんでいるか、質問の表示が制限されています。どちらが真実かわからない。どのように私は人々が_pounce_に答えて(または投票)するために使用された時間を逃す! –
'' dp [i] 'を"警察に警戒せずに 'i + 1'の家から奪うことのできる最大金額"と考えて、それぞれを別のケースとして見てください。 1つの家がある場合( 'i == 0')、あなたはその1つの家からしか盗むことができません。 2つの家( 'i == 1 ')がある場合、あなたが盗むことができるのは、どちらかの家からの最大です(' nums [0]かnums [1] ')。私がやったやり方は 'int dp [i + 1]だった。 dp [0] = 0; dp [1] = nums [1]; ... return dp [nums.size()] '私はより直感的に思えると思います。 – 0x499602D2
@ 0x499602D2、はい、あなたのものは本当に私よりも理にかなっています!ありがとうございました! –