[LeetCode] 198.打家劫舍Ⅰ

题目:

你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入它会自动联系警方

给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。

思路:

本题的大致意思就是求取一个数组中不相邻的数的最大值。

这里,当强盗选取一个房间编号为n去抢劫时,首先需要思考,n号这个房间可不可以被抢劫,即与这个房间相邻的上一个编号为(n-1)的房间有没有被抢劫。因此可知,这里状态分为2种:

①当上一个相邻的编号为(n-1)房间已经被抢劫时,则该房间不能被抢劫,此时抢劫得到的最大金额仍和编号为(n-1)房间时相同;

②当上一个相邻的编号为(n-1)房间没有被抢劫时,则本次抢劫金额为到编号(n-2)的房间的最大金额加上本次房间的金额。

使用dp[i]表示到第i个房间时得到的最大金额数,得到状态转移方程:

dp[i]=max{dp[i-1],dp[i-2]+money[i]};


代码:

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size()==0) return 0;
        int i,dp[100000];
        dp[0]=nums[0];
        dp[1]=nums[0]>nums[1]?nums[0]:nums[1];
        for(i=2;i<nums.size();i++){
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[nums.size()-1];
    }
};

猜你喜欢

转载自blog.csdn.net/lml0703/article/details/80011713