力扣740. 删除并获得点数

动态规划

  • 思路:
    • 选择元素 x,获得其点数,删除 x + 1 和 x - 1,则其他的 x 的点数也会被获得;
    • 可以将数组转换成一个有序 map,key 为 x, value 为对应所有 x 的和;
    • 则问题转换成了不能同时获得相邻两个房间的金币并能获得最大收益问题:力扣198. 打家劫舍
    • 动态规划状态转移方程 dpi 跟之前两个状态相关,可以使用滚动数组的方式,减少空间复杂度:
      • dpi = std::max(dpi - 2 + numsi, dpi - 1)
      • dp0 -> dpi - 2, dp0' = dpi - 1
      • dp1 -> dpi - 1, dp1' = dpi
      • 在使用一个临时变量:
        • tmp = dpi - 1 -> dp1
        • dpi | -> dp1' <- dp1 = std::max(dpi - 2 -> dp0 + numsi, dpi - 1 -> dp1)
        • dpi - 1 | -> dp1 -> tmp
cpp 复制代码
class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        int maxVal = 0;
        for (int val : nums) {
            maxVal = std::max(maxVal, val);
        }

        std::vector<int> sum(maxVal + 1);
        for (int val : nums) {
            sum[val] += val;
        }

        return rob(sum);
    }

private:
    int rob(std::vector<int>& nums) {
        int size = nums.size();
        if (size == 0) {
            return 0;
        }
        if (size == 1) {
            return nums[0];
        }

        int dp0 = nums[0];
        int dp1 = std::max(dp0, nums[1]);
        for (int i = 2; i < size; ++i) {
            int tmp = dp1;
            dp1 = std::max(dp0 + nums[i], dp1);
            dp0 = tmp;
        }

        return dp1;
    }
};

相关推荐
地平线开发者10 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
学习星球14 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
alphaTao19 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid11220 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余1 天前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考1 天前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha60161 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘1 天前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天1 天前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源1 天前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang