DP数组初始化的原因

Posted

技术标签:

【中文标题】DP数组初始化的原因【英文标题】:Reason for such initialization of DP array 【发布时间】:2017-10-08 21:11:47 【问题描述】:

我正在解决来自 LeetCode.com 的a question。问题是这样的:

你是一名职业强盗,计划抢劫沿街的房屋。每栋房子都藏有一定数量的金钱,唯一阻止你抢劫的限制是相邻的房子都连接了安全系统,如果同一晚两栋相邻的房子被闯入,它会自动联系警察。 给定一个代表每所房子的金额的非负整数列表,确定今晚你可以在不报警的情况下抢劫的最大金额。

想了一会儿,我可以得出以下关系,这是正确的:

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 视为一个单独的案例。如果有 1 所房子 (i == 0) 那么你只能从那一所房子里偷东西。如果有两间房子 (i == 1),那么你最多可以偷到两间房子的最大值 (nums[0] or nums[1])。我的做法是int dp[i+1]; dp[0] = 0; dp[1] = nums[1]; ... return dp[nums.size()],我认为这更直观。 @0x499602D2,是的,你的确实比我的更有意义!谢谢! 【参考方案1】:

在给出的解决方案中,将dp[i] 视为“您可以在不报警的情况下从i+1 房屋中抢劫的最大金额”,并将每个i 视为一个单独的案例。如果有 1 所房子 (i == 0) 那么你只能从那一所房子里偷东西。如果有两所房子(i == 1),那么您最多可以偷取任一房子的最大值(nums[0]nums[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];

它返回你可以从i 房屋(不是i+1)窃取的最大金额,我认为这更容易理解。

【讨论】:

【参考方案2】:

如果我理解正确,您的问题可以简化为:Because if nums[0]&gt;nums[1], then doesn't it imply robbing the same house (because we initialize both dp[0] and dp[1] to the same value?)

答案是否定的,这并不意味着抢劫同一所房子。这意味着不要抢劫房子 1,因为房子 0 被抢劫了。而房子 0 被抢劫了,因为它包含更多的钱,你必须在抢劫房子 0 或房子 1(钱少)之间做出选择。

【讨论】:

以上是关于DP数组初始化的原因的主要内容,如果未能解决你的问题,请参考以下文章

❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️

718. 最长重复子数组

718. 最长重复子数组

718. 最长重复子数组

如何初始化所有值相同的2D数组?

718. 最长重复子数组