LeetCode House Robber题解

1,题目内容

题目内容
如上图所示,该题目要求我们找出小偷能够偷取的最大的金额,且由于邻居安全系统的存在,不能在同一天晚上偷取两个相邻的住户。所以,小偷只能偷完一家再偷不相邻的另一家。

2,题解思路

首先分析如下的测试案例。

[2,7,9,3,1]

可见,首先,小偷只能从第一家和第二家选择一家来偷,那么怎么保证所偷金额最大呢?采用动态规划策略来思考:
假定偷了第一家,然后,判断偷不偷第二家。由于开始一分钱没有,偷了第二家,金额是7,比第一家2大,故偷第二家而不偷第一家。
后续这样考虑:
判断偷不偷第n家,由于安全系统的存在,肯定不能是偷完第n-1家来偷第n家,而是偷完了第n-2家后来偷第n家。比较偷完第n-2家后的最大金额加上第n家的金额与偷完第n-1家的最大金额,谁大那么偷完第n家的最大金额就是谁。
如下状态转移方程所示:
best(n)=max(best(n-2)+money(n),best(n-1))
初态置为0(小偷还没开始偷呢哈哈)

3,解题代码

int rob(vector<int>& nums) {
        int finall[105] = { 0 };
        finall[1] = nums[0];
        for (int i = 1; i < nums.size(); i++)
        {
            int temp = finall[i - 1] + nums[i];
            if (temp > finall[i])
                finall[i + 1] = temp;
            else
                finall[i + 1] = finall[i];
        }
        return finall[nums.size()];
    }

4,最终结果展示

在这里插入图片描述

5,友情提醒

虽然该题成功解决,不过,希望各位coder堂堂正正做人,不要像该题中的robber的所作所为哈哈,否则警察叔叔找上门来我可就管不了了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值