LeetCode198 - House Robber

题目描述:

题目还是个有关抢劫的应用题,太逗了。。。

翻译过来就是遍历数组,元素相加,且相邻的元素不能求和,最后返回遍历后的最大值。

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& 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];
    }
};

学习内容:

继续练习动态规划思想

 

你可能感兴趣的:(LeetCode,LeetCode,C,动态规划)