LintCode 534. 打劫房屋 II

在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。

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

注意事项
这题是House Robber的扩展,只不过是由直线变成了圈

样例
给出nums = [3,6,4], 返回 6, 你不能打劫3和4所在的房间,因为它们围成一个圈,是相邻的.

思路:动态规划,从第I题可以得出递推关系式为A[i] = max(A[i-1],A[i-2]+A[i]);这里由于这题变成了一个圈,所以头尾两个数不能同时取到,所以把这个圈分成[0,n-1]和[1,n]两部分分别计算所能得到的最大值然后取较大值就可以了。

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: An array of non-negative integers.
 5      * @return: The maximum amount of money you can rob tonight
 6      */
 7     int houseRobber2(vector<int> &nums) {
 8         // write your code here
 9         int size = nums.size();
10         if(size == 0) return 0;
11         if(size == 1) return nums[0];
12
13         vector<int> L(size,0);//两个数组做动态规划
14         vector<int> R(size,0);
15         L[1] = nums[0];//初始化
16         R[1] = nums[1];
17         for(int i=2;i<size;++i){//递推公式,注意nums中数的顺序先后
18             L[i] = max(L[i-2]+nums[i-1],L[i-1]);
19             R[i] = max(R[i-2]+nums[i],  R[i-1]);
20         }
21         return max(L[size-1],R[size-1]);//取较大值
22     }
23 };

原文地址:https://www.cnblogs.com/J1ac/p/8849610.html

时间: 2024-10-25 20:58:06

LintCode 534. 打劫房屋 II的相关文章

LintCode刷题——打劫房屋I、II、III

打劫房屋I: 题目内容: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警.给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下. 样例: 给定 [3, 8, 4], 返回 8. 挑战: O(n) 时间复杂度 且 O(1) 存储. 算法分析: 前提:对于某一间房子i,如果盗贼要打劫该房子,则房

[poj] The Wedding Juicer | [lintcode] Trapping Rain Water II

问题描述 给定一个二维矩阵,每个元素都有一个正整数值,表示高度.这样构成了一个二维的.有高度的物体.请问该矩阵可以盛放多少水? 相关题目:POJ The Wedding Juicer Description Farmer John's cows have taken a side job designing interesting punch-bowl designs. The designs are created as follows: * A flat board of size W cm

[LintCode] Trapping Rain Water II

Trapping Rain Water II Given n x m non-negative integers representing an elevation map 2d where the area of each cell is 1 x 1, compute how much water it is able to trap after raining. Example Given 5*4 matrix [12,13,0,12] [13,4,13,12] [13,8,10,12] [

算法-打劫房屋III(深搜)

今天做了一道关于二叉树的题,之所以要记录下,这个题的解法真是太巧妙了 题意: 在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的 地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现 这次的地形是一颗二叉树.与前两次偷窃相似的是每个房子都存放着特定金额的 钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且当相邻 的两个房子同一天被打劫时,该系统会自动报警. 算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情 况下. 样例:

Lintcode--011(打劫房屋2)

在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警. 给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下. 注意事项 这题是House Robber的扩展,只不过是由直线变成了圈 样例 给出nums = [

[lintcode medium]Maximum Subarray II

Maximum Subarray II Given an array of integers, find two non-overlapping subarrays which have the largest sum. The number in each subarray should be contiguous. Return the largest sum. Example For given [1, 3, -1, 2, -1, 2], the two subarrays are [1,

[LintCode] 合并排序数组II

1 class Solution { 2 public: 3 /** 4 * @param A: sorted integer array A which has m elements, 5 * but size of A is m+n 6 * @param B: sorted integer array B which has n elements 7 * @return: void 8 */ 9 void mergeSortedArray(int A[], int m, int B[], i

LintCode &quot;Continuous Subarray Sum II&quot;

Flip over your mind: in rotated subarray case, we can simply cut the continuous smallest subarray. class Solution { public: /** * @param A an integer array * @return A list of integers includes the index of * the first number and the index of the las

LintCode &quot;Find Peak Element II&quot;

Idea is the same: climbing up the hill along one edge (Greedy)! Visualize it in your mind! class Solution { public: /** * @param A: An integer matrix * @return: The index of the peak */ vector<int> findPeakII(vector<vector<int> > A) { in