2017-10-08 10 views
0

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]; 
    } 
}; 
+0

コミュニティメンバーの過半数が秋休みを楽しんでいるか、質問の表示が制限されています。どちらが真実かわからない。どのように私は人々が_pounce_に答えて(または投票)するために使用された時間を逃す! –

+0

'' 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

+0

@ 0x499602D2、はい、あなたのものは本当に私よりも理にかなっています!ありがとうございました! –

答えて

0

と見それぞれiを別個のケースとして扱います。 1つの家(i == 0)がある場合、その1つの家からのみ盗むことができます。 2つの家(i == 1)がある場合、あなたが盗むことができるのは、どちらかの家(nums[0]またはnums[1])からの最大です。私がやった方法は、それは:あなたは、私が理解しやすいと思いi家(ないi+1)、から盗むことができるお金の最大量を返し

int n = nums.size(); 
int dp[n+1]; // max $ you can rob from i houses with altering police 
dp[0] = 0; // no houses, no money 
dp[1] = nums[0]; 
for (int i = 2; i <= n; ++i) { 
    dp[i] = max(dp[i - 1], nums[i - 1] + dp[i - 2]); 
} 
return dp[n]; 

0

質問が正しく理解されている場合は、Because if nums[0]>nums[1], then doesn't it imply robbing the same house (because we initialize both dp[0] and dp[1] to the same value?)になります。

答えはいいえ、同じ家を奪うことを意味するものではありません。それは家0が奪われたので家1を奪うことを意味しない。そして家0はそれ以上のお金を含んでいたので奪われました。あなたは家0か家1のどちらかを奪うことを選択しなければなりませんでした。

関連する問題