leetcode-198-House Robber(动态规划)
题目描述:
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(动态规划)的更多相关文章
- Leetcode 198 House Robber 动态规划
题意是强盗能隔个马抢马,看如何获得的价值最高 动态规划题需要考虑状态,阶段,还有状态转移,这个可以参考<动态规划经典教程>,网上有的下的,里面有大量的经典题目讲解 dp[i]表示到第i匹马 ...
- [LeetCode] 198. 打家劫舍II ☆☆☆(动态规划)
描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的 ...
- 198. House Robber(动态规划)
198. House Robber You are a professional robber planning to rob houses along a street. Each house ha ...
- 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:二叉树下的不能相邻,求能 ...
- [LeetCode] 198. House Robber 打家劫舍
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- (easy)LeetCode 198.House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- Java [Leetcode 198]House Robber
题目描述: You are a professional robber planning to rob houses along a street. Each house has a certain ...
- Leetcode 198 House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- Java for LeetCode 198 House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- [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 ...
随机推荐
- controller,service,repository,component注解的使用对比
项目中的controller层使用@controller注解 @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象.分发处理器将会扫描使用了 ...
- java判断一个数是否为素数[转]
http://blog.csdn.net/lwcumt/article/details/8027586 import java.util.Scanner; //质数又称素数,是指在一个大于1的自然数中 ...
- [SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到Excel
import static java.lang.Math.* import java.text.NumberFormat import java.awt.Color import com.eviwar ...
- Nlog- Application Logging in C#
当你在谷歌搜索 Application Loggin in C#,排在最前面的是这个 .NET Logging Tools and Libraries ,点击进去你会发现里面收录了不错的日记工具及文 ...
- C#变量初始化
在C#中声明变量使用下述语法: datatype identifier;, 例如: int i; 该语句声明int变量i.编译器不允许在表达式中使用这个变量,除非用一个值初始化了改变量.如果你不需要使 ...
- AngularJs(v1)相关知识和经验的碎片化记录
1.利用angular指令监听ng-repeat渲染完成后执行脚本 http://www.cnblogs.com/wangmeijian/p/5141266.html 2.$http的POST请求中请 ...
- Pandas -- Merge,join and concatenate
Merge, join, and concatenate pandas provides various facilities for easily combining together Series ...
- CodeForces 474B Worms (水题,二分)
题意:给定 n 堆数,然后有 m 个话询问,问你在哪一堆里. 析:这个题是一个二分题,但是有一个函数,可以代替写二分,lower_bound. 代码如下: #include<bits/stdc+ ...
- Java SimpleDateFormat用法
? Java中怎么才能把日期转换成想要的格式呢,或把字符串转换成一定格式的日期,如把数据库中的日期或时间转换成自己想要的格式,JAVA中提供了SimpleDateFormat类可以实现,以下是Si ...
- OpenCV实现pHash哈希
离散余弦变换(DCT,Discrete Cosine Transform)是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT,Discrete Fourier Transform),但是只使 ...