题目描述:

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. 554. Brick Wall最少的穿墙个数

    [抄题]: There is a brick wall in front of you. The wall is rectangular and has several rows of bricks. ...

  2. 利用SHELL脚本修改当前环境变量

    转自http://www.chinaunix.net/old_jh/7/21485.html 1.背景 ---- 在日常的工作中,为了设置一大批环境变量,我们通常编辑了一个shell程序,包含了多个的 ...

  3. 美化input type=range标签滑动样式(带渐变效果)

    input原来的样式就不在此赘述了: 下面看一下实际项目中用到的input输入框,同步绑定输入数据,实现输入框双向绑定(实际项目中使用的是vue框架): html部分: <div class=& ...

  4. CentOS7 Failed to start LSB: Bring up/down

    原文地址:http://addam.blog.51cto.com/5041993/1839518 刚刚装好的虚拟机突然不能上网了,报错很诡异,具体报错如下: /etc/init.d/network r ...

  5. CodeForces 681C Heap Operations (模拟题,优先队列)

    题意:给定 n 个按顺序的命令,但是可能有的命令不全,让你补全所有的命令,并且要求让总数最少. 析:没什么好说的,直接用优先队列模拟就行,insert,直接放入就行了,removeMin,就得判断一下 ...

  6. up7.1-asp.net-本地测试教程

    1.1. ASP.NET 框架:.NET Framework 4.5 依赖库:csredis,Newtonsoft.Json   安装redis 下载 redis-x64:http://pan.bai ...

  7. review一个javascript功能函数

    近半年来一直觉得自己在技术上好像左右挣扎,技术没啥提升,看书看不进,自学还挺慢.写出来的东西,自己都觉得不满意.让自己也用庸人自扰的感觉. 最近,在工作中,有一个小小的功能需要实现,这个功能非常简单, ...

  8. 编写高质量代码改善C#程序的157个建议——建议122:以<Company>.<Component>为命名空间命名

    建议122:以<Company>.<Component>为命名空间命名 建议以<Company>.<Component>为程序集命名,比如Microso ...

  9. Appium常用API(一)

    Appium作为当下一款移动应用的自动化测试工具,对于测试来说重要性不言可寓,废话不多说,下面总结下它常用的API: 1.contextscontexts(self): Returns the con ...

  10. 团体程序设计天梯赛L1-022 奇偶分家 2017-03-22 17:48 81人阅读 评论(0) 收藏

    L1-022. 奇偶分家 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定N个正整数,请统计奇数和偶数各有多少个? 输入格式 ...