LintCode-打劫房屋

假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。

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

样例

给定 [3, 8, 4],
返回 8.

挑战

O(n) 时间复杂度 且 O(1) 存储。

分析:又是一个动态规划问题,我们设dp[i]表示到i为止且包括i为最后一个盗窃的房子得到的最大值,很明显取决于dp[i-2]和dp[i-3],和dp[i-4]无关了,因为取dp[i-4]的情况可以包含在dp[i-2]的情况下

代码:

class Solution {
public:
    /**
     * @param A: An array of non-negative integers.
     * return: The maximum amount of money you can rob tonight
     */
    long long houseRobber(vector<int> A) {
        // write your code here
        int n = A.size();
        if(n==0)
            return 0;
        long long ret = A[0];
        vector<long long> dp(3,0);
        for(int i=0;i<n;i++)
        {
            long long temp = 0;
            for(int j=0;j<2;j++)
            {
                temp = max(temp,dp[j]+A[i]);
            }
            ret = max(ret,temp);
            dp.push_back(temp);
            dp.erase(dp.begin());
        }
        return ret;
    }
};
时间: 2024-11-08 23:11:32

LintCode-打劫房屋的相关文章

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

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

LintCode 534. 打劫房屋 II

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

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

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

Lintcode--011(打劫房屋2)

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

动态规划问题以及诸多实例分析

开始,我先完整的分析一个动态规划问题,叫做钢条切割问题,这个问题从递归开始导入,然后引入带备忘录的自顶向下方法,最后得到动态规划的解法.所有的问题都可以遵循这样的解决方法.然后开始分析如何用递归求解动态规划问题,最后分析如何使用动态规划的解法. 钢条切割问题: 问题描述,给定一个数组,表示的是出售长度为i的钢条的价格.如p = [1, 5, 8, 9, 10, 17, 17, 20, 24, 30] 表示的是长度为1的钢条为1美元,长度为2的钢条为5美元,以此类推. 现在有一个钢条长度为n,那么

lintcode - 房屋染色

1 class Solution { 2 public: 3 /* 4 * @param costs: n x 3 cost matrix 5 * @return: An integer, the minimum cost to paint all houses 6 */ 7 const int inf = 0x3f3f3f3f; 8 vector<vector<int> > dp; 9 int minCost(vector<vector<int>> &am

[lintcode the-smallest-difference]最小差(python)

题目链接:http://www.lintcode.com/zh-cn/problem/the-smallest-difference/ 给定两个整数数组(第一个是数组 A,第二个是数组 B),在数组 A 中取 A[i],数组 B 中取 B[j],A[i] 和 B[j]两者的差越小越好(|A[i] - B[j]|).返回最小差. 排好序后用两个指针分别扫描两个数组,每次更新他们的差值的绝对值.并且依据他们两个数字的大小来决定谁来移动指针. 1 class Solution: 2 # @param

lintcode.44 最小子数组

最小子数组 描述 笔记 数据 评测 给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 注意事项 子数组最少包含一个数字 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Facebook Google

lintcode 66.67.68 二叉树遍历(前序、中序、后序)

AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * @param root: The r