House Robber II

来源:互联网 发布:砸金蛋软件 编辑:程序博客网 时间:2024/05/21 22:54

题目来源http://www.lintcode.com/zh-cn/problem/house-robber-ii/

题目描述

所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警

给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,在不触动报警装置的情况下,你最多可以得到多少钱 。

解决方法 = 动态规划

House Robber I的升级版,只不过又增加了一个新的约束条件:第一个元素和最后一个元素不能同时使用。

因为第一个和最后一个元素不能同时出现,所以可看成求解两次House Robber I,即

  1. 有第一个元素,没有最后一个元素;
  2. 没有第一个元素,有最后一个元素;

两者的最大值即为所求

代码

class Solution {public:    /**     * @param nums: An array of non-negative integers.     * return: The maximum amount of money you can rob tonight     */    int houseRobber2(vector<int>& nums) {        // write your code here        int size = nums.size();        if (size == 0) {            return 0;        }        if (size == 1) {            return nums[0];        }        if (size == 2) {            return max(nums[0], nums[1]);        }        int r1 = houseRobber1(nums, 0, size - 2);        int r2 = houseRobber1(nums, 1, size - 1);        return max(r1, r2);    }    int houseRobber1(vector<int>& nums, int left, int right) {        if (left == right) {            return nums[left];        }        if ((right - left) == 1) {            return max(nums[left], nums[right]);        }        int n1 = nums[left];        int n2 = max(nums[left], nums[left + 1]);        int n3, n4;        left += 2;        while (left <= right) {            n3 = n1 + nums[left];            n4 = max(n2, n3);            n1 = n2;            n2 = n4;            left++;        }        return max(n1, n2);    }};

请尊重作者的劳动,转载请注明作者及原文地址(http://blog.csdn.net/lis_12/article/details/55212576).

如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。

0 0
原创粉丝点击