题目描述:
题目还是个有关抢劫的应用题,太逗了。。。
翻译过来就是遍历数组,元素相加,且相邻的元素不能求和,最后返回遍历后的最大值。
如input: [1, 2, 3, 1],可能的情况为 1 + 3、1 + 1、 2 + 1,所以output: 4
思路解析:
第一反应便是动态规划问题,因为之后的情况与之前的情况有关。那边需建立动态数组,并找到状态转移方程。
动态数组StolenMoney[i],表示偷完第 i 个房子后,已偷到的钱数。
通过举个例子来找到状态转移方程,如题目描述中的例子input: [1, 2, 3, 1]。偷完第1个,钱数为1--->>因为不能连续偷两个,即需要比较第1个房子和第2个房子的钱数然后取舍,偷完第2个,钱数为2--->>第3个房子,就需要将第1个钱数+第3个钱数与第2个钱数做比较,取最大的值。如此类推,所以:
状态转移方程 StolenMoney[i] = max(StolenMoney[i-2] + nums[i], StolenMoney[i-1]),即在第 i 个房子时,已偷钱数为第i-2房子时已偷钱数+第 i 个房子的存钱数 和 第 i - 1房子中已偷钱数比较取大值。
代码实现:
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.empty()) return 0;
if (nums.size() == 1) return nums[0];
if (nums.size() == 2) return max(nums[0], nums[1]);
// define dynamic arrays
int StolenMoney[nums.size()];
StolenMoney[0] = nums[0];
StolenMoney[1] = max(nums[0], nums[1]);
for (int i = 2; i < nums.size(); i++) {
StolenMoney[i] = max(StolenMoney[i-2] + nums[i], StolenMoney[i-1]);
}
return StolenMoney[nums.size() - 1];
}
};
学习内容:
继续练习动态规划思想