动态规划解决leetcode中的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.

也就是给一个数组,每个数组的元素代表了这个房间中的金额,但是两个相邻的两个房间不能同时抢劫。问题是强盗最多能抢劫多少金额?

假如数组是:
1,3,5,7,9
也就是第一间房有1百万,第二间房有300万。。。

动态规划的思想就是将大问题拆解成小问题,然后保存中间计算的值。这样减少运算的复杂程度。

首先我定义两个变量
pre_one:代表数组中当前值所在位置前半部分序列的最优解
pre_two:代表数组中当前值所在位置的前一个值的前半部分序列的最优解

比如说小偷现在走到了有700万的那间房,他已经知道了1,3,5这三个房间的最优解,也就是pre_one。
已经知道了1,3这两个房间的最优解,也就是pre_two。

到底要不要抢劫这间700万的房呢?有两个选择:

  1. 如果抢劫该房间,那么上一间房间就不能抢劫,这样pre_two就派上了用场。
  2. 如果不抢劫该房间,那么pre_one就派上了用场。
    最终的决定的依据就是判断这两种抉择孰大孰小。

代码如下:

class Solution {
public:
    int rob(vector<int>& nums) {
        // 保存当前值的之前序列的最优解
        int pre_one = 0;
        // 保存当前值的前一个值的之前序列的最优解
        int pre_two = 0;
        // 包含当前值的之前序列的最优解
        int rob = 0;
        int len = nums.size();
        for(int i=0; i<len; i++)
        {
            rob = max(pre_one, pre_two + nums[i]);
            pre_two = pre_one;
            pre_one = rob;
        }
        return rob;   
    }
};
点赞