• LeetCode198. 打家劫舍


    用dp[i]表示打劫到第i个房子(i从0开始)时能获取到的最高金额,显然对于第i个房子,我们有打劫和不打劫两种方案。

    如果不打劫第i个房子,那么到第i个房子能获取的最高金额和到第i - 1个房子能获取到的最高金额是一样的(因为到了第i个房子这里没有收入嘛)。因此我们有dp[i] = dp[i - 1];

    如果打劫第i个房子,那么到第i个房子能获取到的最高金额就是到第i - 2个房子能获取到的最高金额加上打劫第i个房子获得的收入(因为不能连着打劫,所以是第i - 2个房子)。因此我们有dp[i] = dp[i - 2] + nums[i];

    但是对于一个房子,我们不知道最佳方案里是否要打劫这个房子,所以对于两种方案取最大值,就是当前的最高金额了。

    最后的返回值就是打劫到最后一个房子能获取到的最高金额。

    class Solution {
    public:
        int rob(vector<int>& nums) {
            if(nums.size() == 0) {
                return 0;
            } 
            if(nums.size() == 1) {
                return nums[0];
            }
            vector<int> dp(nums.size());
            dp[0] = nums[0], dp[1] = max(nums[0], nums[1]);
            for(int i = 2; i < nums.size(); ++i) {
                dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
            }
            return dp[nums.size() - 1];
        }
    };
    
  • 相关阅读:
    继承与多态
    String作业
    课后作业及动手动脑
    作业3
    动手动脑
    实验任务四
    动手动脑
    课堂练习01
    《大道至简》第一章读后感伪代码
    C++常用编程关键字
  • 原文地址:https://www.cnblogs.com/linrj/p/13433860.html
Copyright © 2020-2023  润新知