LeetCode House Robber 家庭劫犯(dp)
题意:有一个整数序列,从中挑出一些数字,使得总和是最大,前提是,相邻的两个数字中只能挑其一。比如1 2 3 就只能挑2或者1和3。
思路:很直观的题,dp思想。降低规模,从小规模开始考虑。如果只有两个数字,那么结果很明显就能知道是其中之大者。假如已经知道了第 i 个之前的决策,那么第i+2个之前的决策也就知道了。前两个数字已经由人工得知,设为dp[0]和dp[1],那么dp[2]=max(dp[0]+nums[2], dp[1])。状态转移方程dp[i]=max(dp[i-1], dp[i-2]+num[i] )。
这里有状态压缩的思想,只不过状态只有两个,0和1代表前一个数字是否被挑出。即dp数组的下标,1代表i-1个之前的决策结果,也代表了第i-1个已经挑出,所以第i个不能再挑出来了;但是0代表i-2个之前的决策结果,也代表了i-1个不挑出。
1 class Solution { 2 public: 3 int rob(vector<int>& nums) { 4 if(nums.empty()) return 0; 5 if(nums.size()==1) return nums[0]; 6 if(nums.size()==2) return max(nums[1],nums[0]); 7 8 int dp[2]; 9 dp[0]=nums[0]; //初始化也是很重要的 10 dp[1]=max(nums[0],nums[1]); 11 12 for(int i=2; i<nums.size(); i++) 13 { 14 int tmp=max(dp[1],dp[0]+nums[i]); 15 dp[0]=dp[1];//往前移。因为dp[0]已经没作用了 16 dp[1]=tmp; 17 } 18 return dp[1]; 19 } 20 };
AC代码
转载于:https://www.cnblogs.com/xcw0754/p/4498047.html
LeetCode House Robber 家庭劫犯(dp)相关推荐
- LeetCode 486. 预测赢家(博弈DP)
文章目录 1. 题目 2. 解题 1. 题目 给定一个表示分数的非负整数数组. 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,-- . 每次一个 ...
- LeetCode 91. Decode Ways--动态规划DP的Python和Java解法
题目地址: LeetCode 动态规划(Dynamic programming)系列题目:LeetCode 动态规划(Dynamic programming)系列题目 A message contai ...
- LeetCode House Robber III(动态规划)
问题:给出一个树,只能隔一层取值,求最大值. 思路:方法一用dp(node)从当前结点开始可以取的最大值.当取node的值时,dp(node)=node.val + dp(node.left.left ...
- LeetCode House Robber II(动态规划)
问题:给出一个数组,表示房屋内藏有的现金.房屋围成一圈.相邻房间装有防盗系统,如果相邻的房间在同一晚上被偷,系统会自动报警.要求在不触到警报的情况下,能够偷到的最高金额. 思路:因为房屋围成一圈,并且 ...
- LeetCode 309: 一个很清晰的DP解题思路
问题来源 题目来源链接见下方: https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/descript ...
- LeetCode 1187. 使数组严格递增(DP)*
文章目录 1. 题目 2. 解题 1. 题目 给你两个整数数组 arr1 和 arr2,返回使 arr1 严格递增所需要的最小「操作」数(可能为 0). 每一步「操作」中,你可以分别从 arr1 和 ...
- LeetCode 956. 最高的广告牌(DP)
文章目录 1. 题目 2. 解题 1. 题目 你正在安装一个广告牌,并希望它高度最大. 这块广告牌将有两个钢制支架,两边各一个.每个钢支架的高度必须相等. 你有一堆可以焊接在一起的钢筋 rods. 举 ...
- LeetCode 1563. 石子游戏 V(DP)
文章目录 1. 题目 2. 解题 2.1 区间DP 1. 题目 几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出. 游戏中的每一轮: Alice 会将这行 ...
- LeetCode 1140. 石子游戏 II(DP)*
文章目录 1. 题目 2. 解题 1. 题目 亚历克斯和李继续他们的石子游戏.许多堆石子 排成一行,每堆都有正整数颗石子 piles[i].游戏以谁手中的石子最多来决出胜负. 亚历克斯和李轮流进行,亚 ...
最新文章
- iOS-禁止scrollview垂直方向滚动,只允许水平方向滚动;或只允许垂直方向滚动...
- 【Arduino基础教程】FSR402力敏电阻器
- BZOJ1457 棋盘游戏
- 【渝粤题库】陕西师范大学202091公共管理学原理 作业(高起本、专升本)
- 盘点和程序员相关的那些事,让你不再被割韭菜,薅羊毛!
- 漫画:如何实现大整数相乘?(下)
- 【java】java 如何抛出 sleep interrupted
- Mybatis在Maven项目中使用
- 服务器图片加载慢_页面提高性能利器_懒加载
- 华数机器人编程语言_招新 | 海大最「酷」的科创团队,确定不来了解一下吗?...
- 基于semisync实现MySQL的主从半同步复制
- 【图像隐写】基于matlab DCT数字水印嵌入+攻击+提取【含Matlab源码 1758期】
- BZOJ2199[Usaco2011 Jan] 奶牛议会
- unity 反编译 step1 disUnity
- 如何将java项目部署到linux环境(Tomcat)
- android 强制关闭键盘,Android关闭输入软键盘无效的问题
- 《我要飞,永远都不会累 》---伤感留言
- iPhone 11首发评测:你该不该用它换旧iPhone
- 笔记本电脑黑屏 笔记本开机黑屏 笔记本黑屏怎么办
- Kafka之Controller(Broker的领导者)