• LeetCode 每日一题 198. 打家劫舍


    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

    给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

    示例 1:

    输入: [1,2,3,1]
    输出: 4
    解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
         偷窃到的最高金额 = 1 + 3 = 4 。
    

    示例 2:

    输入: [2,7,9,3,1]
    输出: 12
    解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
         偷窃到的最高金额 = 2 + 9 + 1 = 12 。
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/house-robber
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    dp[i] = max(dp[i-2]+nums[i],dp[i-1])dp[i]表示前 i 个的最大收益。

    • 第 i 个取了, dp[i] = dp[i-2] + nums[i]
    • 第 i 个不取, dp[i] = dp[i-1]

    此题可以滚动数组优化。

    class Solution {
     public:
      int rob(vector<int>& nums) {
        int n = nums.size();
        int ans(0);
        vector<int>f(3, 0);
        for(int i = 0; i < n; ++i) {
          if(i - 2 >= 0)
            f[i % 3] = f[(i - 2 + 3) % 3] + nums[i];
          else
            f[i % 3] = nums[i];
          if(i - 1 >= 0)
            f[i % 3] = max(f[i % 3], f[(i - 1 + 3) % 3]);
          ans = max(ans, f[i % 3]);
          cout << f[i % 3] << " ";
        }
        return ans;
    
      }
    };
    
    
  • 相关阅读:
    配置文件中文件重复
    大型网站技术架构02
    2018.12.26-12.30第一周毕设计划
    软件架构模式-分层架构II
    软件架构模式-分层架构
    echarts实现中国地图数据展示
    Python数据分析入门(一)——了解Python下的函数包
    Python学习笔记(二)
    Python学习笔记(一)
    Echarts的简单使用
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/12985635.html
Copyright © 2020-2023  润新知