我正在從LeetCode.com上解決a question。問題是這樣的:DP陣列初始化的原因
你是一個專業的搶劫者計劃搶劫沿街的房屋。每間房屋都藏有一定數量的金錢,唯一阻止你搶劫每間房屋的限制因素是鄰近的房屋有保安系統連接,並且如果在同一晚上有兩間相鄰的房屋被闖入,它將自動與警方聯繫。
給出一個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒警方的情況下搶劫的最高金額。
思考了一段時間後,我能想出下面的關係,這是正確的:
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]
是不是連續的房子?
的完整代碼(如果需要)低於:
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];
}
};
大部分社區成員都在享受秋假,或者我的問題的可見性受到限制。我不確定哪一個是真的。我多麼想念人們過去常常回答(或投票)問題的時間! –
把'dp [i]'想象成:「你可以從'i + 1'房屋中搶劫而不必警覺警察的最大金額」,並將每個'i'視爲一個單獨的案例。如果有一間房子('i == 0'),那麼你只能從那間房子偷走。如果有兩間房子('i == 1'),那麼你可以偷的最多的是來自任何房子的最大值('nums [0]或nums [1]')。我這樣做的方式是'int dp [i + 1]; dp [0] = 0; dp [1] = nums [1]; ... return dp [nums.size()]'我認爲這更直觀。 – 0x499602D2
@ 0x499602D2,是的,你確實比我的更有意義!謝謝! –