LeetCode—House Robber 寻找数组不相邻组合最大值DP
2015-04-12 22:49
363 查看
https://leetcode.com/problems/house-robber/
题目设计了一个抢劫犯的情景,其实就是求数组中不相邻数据进行组合得到的最大值
举一个例子
假设数据: 8 3 6 15 4 9 7 10
那么首先可能选取 8 , 3
每一个数字的选取都是根据他的前两个数字,前三个数字得到的最大值进行选择,等到6的时候考虑前面只能和8组合 8,3,14
到数字15,那么就可以考虑在8,3中进行组合 8,3,14,23,4,9,7,10
接下来的步骤:
8,3,14,23,18,9,7,10
8,3,14,23,18,32,7,10
8,3,14,23,18,32,30,10
8,3,14,23,18,32,30,42 最后是42
其实这是一个DP的问题:
A[i][0]表示第i次没有抢劫,A[i][1]表示第i次进行了抢劫
即A[i+1][0] = max(A[i][0], A[i][1]).. 那么rob当前的house,只能等于上次没有rob的+money[i+1], 则A[i+1][1] = A[i][0]+money[i+1].
实际上只需要两个变量保存结果就可以了,不需要用二维数组
[cpp] view
plaincopyprint?
class Solution {
public:
int rob(vector<int> &num) {
int best0 = 0; // 表示没有选择当前houses
int best1 = 0; // 表示选择了当前houses
for(int i = 0; i < num.size(); i++){
int temp = best0;
best0 = max(best0, best1); // 没有选择当前houses,那么它等于上次选择了或没选择的最大值
best1 = temp + num[i]; // 选择了当前houses,值只能等于上次没选择的+当前houses的money
}
return max(best0, best1);
}
};
题目设计了一个抢劫犯的情景,其实就是求数组中不相邻数据进行组合得到的最大值
举一个例子
假设数据: 8 3 6 15 4 9 7 10
那么首先可能选取 8 , 3
每一个数字的选取都是根据他的前两个数字,前三个数字得到的最大值进行选择,等到6的时候考虑前面只能和8组合 8,3,14
到数字15,那么就可以考虑在8,3中进行组合 8,3,14,23,4,9,7,10
接下来的步骤:
8,3,14,23,18,9,7,10
8,3,14,23,18,32,7,10
8,3,14,23,18,32,30,10
8,3,14,23,18,32,30,42 最后是42
class Solution { public: int rob(vector<int> &num) { if(num.empty()) { return 0; } int res = 0; int length = num.size(); if(1 == length) { return num[0]; } if(length >= 3) { num[2] = num[0]+num[2]; } for(int i = 3; i < length; i++) { if(num[i-2]>num[i-3]) { num[i] += num[i-2]; } else { num[i] += num[i-3]; } } return (num[length-2]>num[length-1])? num[length-2]:num[length-1]; } };
其实这是一个DP的问题:
A[i][0]表示第i次没有抢劫,A[i][1]表示第i次进行了抢劫
即A[i+1][0] = max(A[i][0], A[i][1]).. 那么rob当前的house,只能等于上次没有rob的+money[i+1], 则A[i+1][1] = A[i][0]+money[i+1].
实际上只需要两个变量保存结果就可以了,不需要用二维数组
[cpp] view
plaincopyprint?
class Solution {
public:
int rob(vector<int> &num) {
int best0 = 0; // 表示没有选择当前houses
int best1 = 0; // 表示选择了当前houses
for(int i = 0; i < num.size(); i++){
int temp = best0;
best0 = max(best0, best1); // 没有选择当前houses,那么它等于上次选择了或没选择的最大值
best1 = temp + num[i]; // 选择了当前houses,值只能等于上次没选择的+当前houses的money
}
return max(best0, best1);
}
};
相关文章推荐
- LeetCode-198. House Robber (JAVA)寻找数组不相邻组合最大值DP
- [LeetCode] House Robber II 求循环数组中元素两两不相邻的子序列最大和
- LeetCode (20) house robber (数组不相邻元素最大值)
- House Robber I - 由数组中不相邻元素组成的子数组,使其和最大
- leetcode HouseRobber Dp Code
- Maximum Gap 寻找数组中排序后相邻两个数的最大差值,桶排序,O(n)
- 在一个整数数组中寻找符合A+B=C的组合,使C为最大
- leetcode_198. House Robber 抢劫不相邻的房子,使得抢到的金钱数目最大, 动态规划
- leetcode-House Robber III-337(树形dp)
- leetcode213. [DP]House Robber II
- House Robber II:打家劫舍 取非相邻元素求和最大,且认为第一个元素与最后一个元素相邻
- LeetCode 198. House Robber【DP+滚动数组】
- leetcode -- House Robber II -- 重点dp
- Leetcode 213 House Robber II 抢劫最大金额
- LeetCode House Robber || DP
- LeetCode House Robber DP
- [LeetCode]House Robber II (二次dp)
- [LeetCode] House Robber 求数组中元素两两不相邻的子序列最大和
- House Robber:在不取相邻元素的情况下对数组求和
- [leetcode][DP] House Robber II