题目描述:

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
  Total amount you can rob = 1 + 3 = 4.

Example 2:

Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
  Total amount you can rob = 2 + 9 + 1 = 12.

要完成的函数:

int rob(vector<int> &num)

说明:

1、给定一个vector,要求从vector中选出几个数,这几个数不能是彼此相邻的。在这个条件下,挑选出几个数让他们的和达到最大,输出最大的这个和。

2、这道题很明显是动态规划的题目,我们只需要遍历一遍vector就可以得到答案。

动态规划的题目最重要的是要把给定的vector切分成一个又一个的阶段,比如[1,3,1,3,100,3,1]。我们可以这样想:

要达到最大和,我们可以求出前五个数的最大和+1,或者是前四个数的最大和+3/+1,

而前五个数的最大和是前三个数的最大和+100,或者是前两个数的最大和+3/+100.

那看来我们需要把每个数作为一个阶段,求出每个阶段的最大和。

显而易见,如果没有元素,那么最大和为0

如果只有一个元素,那么最大和为第一个元素的值

如果有两个元素,那么最大和为两个元素的max

我们如下构造代码:(附详解)

    int rob(vector<int>& nums)
{
int s1=nums.size();
if(s1==0)//边界条件
return 0;
else if(s1==1)//边界条件
return nums[0];
else if(s1==2)//边界条件
return max(nums[0],nums[1]);
int qian=max(nums[0]+nums[2],nums[1]),hou=max(nums[0],nums[1]),i=4;//把第三个元素这个阶段的最大和叫做qian,
                                            //把第二个元素这个阶段的最大和叫做hou
while(i<=s1-1)//开始迭代处理
{
hou=max(hou+nums[i-1],qian);//第四个元素这个阶段的最大和,有可能是hou这个阶段的最大和+当前值,也有可能是qian这个阶段的最大和
qian=max(hou,qian+nums[i]);//第五个元素这个阶段的最大和,有可能是前面hou这个阶段的最大和,也有可能是之前的qian+当前值
i+=2;//每一步处理完加上2,迭代处理
}
if(i==s1)//如果处理完之后还剩最后一个元素没有处理,那么再相同方法处理一下hou的值
hou=max(hou+nums[i-1],qian);
return max(qian,hou);
}

上述代码实测4ms,beats 14.42% of cpp submissions。不知道怎么改进可以更加优化了……

知道的朋友在评论区分享一下呗~~

leetcode-198-House Robber(动态规划)的更多相关文章

  1. Leetcode 198 House Robber 动态规划

    题意是强盗能隔个马抢马,看如何获得的价值最高 动态规划题需要考虑状态,阶段,还有状态转移,这个可以参考<动态规划经典教程>,网上有的下的,里面有大量的经典题目讲解 dp[i]表示到第i匹马 ...

  2. [LeetCode] 198. 打家劫舍II ☆☆☆(动态规划)

    描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的 ...

  3. 198. House Robber(动态规划)

    198. House Robber You are a professional robber planning to rob houses along a street. Each house ha ...

  4. leetcode 198. House Robber 、 213. House Robber II 、337. House Robber III 、256. Paint House(lintcode 515) 、265. Paint House II(lintcode 516) 、276. Paint Fence(lintcode 514)

    House Robber:不能相邻,求能获得的最大值 House Robber II:不能相邻且第一个和最后一个不能同时取,求能获得的最大值 House Robber III:二叉树下的不能相邻,求能 ...

  5. [LeetCode] 198. House Robber 打家劫舍

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  6. (easy)LeetCode 198.House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  7. Java [Leetcode 198]House Robber

    题目描述: You are a professional robber planning to rob houses along a street. Each house has a certain ...

  8. Leetcode 198 House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  9. Java for LeetCode 198 House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  10. [LeetCode] 198. House Robber _Easy tag: Dynamic Programming

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

随机推荐

  1. Windows ---- mysql 5.7 配置安装

    去官网下载mysql 下载地址    https://dev.mysql.com/downloads/mysql/    根据自己操作系统位数选择相对应的版本 点击Download下载 下载下来后是一 ...

  2. JSON_UNESCAPED_UNICODE

    JSON_UNESCAPED_UNICODE(中文不转为unicode)

  3. System.Reflection.Emit摘记

    动态类型在.net中都是用什么类型来表示的.程序集:System.Reflection.Emit.AssemblyBuilder(定义并表示动态程序集)构造函数:System.Reflection.E ...

  4. Smarty的基本语法------变量调节器

    (1)首字母大写capitalize示例:{$articleTitle|capitalize}(2)字符串连接 cat示例:{$articleTitle|cat:" yesterday.&q ...

  5. centos7如何知道jdk的在哪个目录

    今天一个小实验需要安装jdk,用命令Java -version查询了一下,原来Centos7自带OpenJDK的环境,但是需要手动配置/etc/profile文件,于是开始找java的安装路径.... ...

  6. Visual Studio 2015 开发 ASP.NET 5 有何变化?(转)

    出处:http://www.cnblogs.com/xishuai/p/visual-studio-2015-preview-asp-net-5-change.html 本篇博文目录: ASP.NET ...

  7. [GO]并行和并发的区别

    并行:指在同一时刻,有多条指令在多个处理器上同时执行 并发:指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只有把时 ...

  8. JavaScript面向对象编程小游戏---贪吃蛇

    1 面向对象编程思想在程序项目中有着非常明显的优势: 1- 1 代码可读性高.由于继承的存在,即使改变需求,那么维护也只是在局部模块 1- 2 维护非常方便并且成本较低. ​ 2 这个demo是采用了 ...

  9. 引用的一道JAVA题目

    code: class A { A() {}} class B extends A { } Which two statements are true? (Choose two) A. Class B ...

  10. Params应用

    有时候我们要想传递可变数量的参数改怎么办??Params给我们提供了一个很好的方法 Parmas: 1.只运用方法的最后一位参数 2.这个参数只能标志任意类型的一位数组 3.添加了params这个参数 ...