当前位置:首页 > 力扣 > 力扣740.删除并获得点数 预处理与动态规划的巧妙融合

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

10个月前 (05-17)

力扣740.删除并获得点数 预处理与动态规划的巧妙融合 动态规划 C++ 算法 力扣 数组 第1张

题意解析:

给定一组数字,每当你选择一个数字x时,所有等于x-1和x+1的数字都会被自动移除。你需要通过巧妙的选择顺序,最大化获得的点数总和。这个问题可以转化为对离散化数字分布的动态规划问题——将相邻数字视为互斥选项,通过预处理聚合同类数值,转化为经典的序列决策问题。


思路解析:

代码通过‌预处理聚合+动态规划‌实现高效求解:

1‌.数值聚合‌:

    创建num1数组存储每个数字的总和(例如数字3出现两次则num1[3]=6)

    将原始问题转化为不能选择相邻数值的最优决策问题

‌2.动态规划初始化‌:

    dp[0]直接取num1[0](唯一选择)

    dp[1]取前两个值的较大者

    dp[2]对比三种可能路径:选首尾、选中间、全不选

3‌.递推策略设计‌:

    从第三位开始,状态转移方程为dp[i] = max(隔前两位抢当前,隔前三位抢当前)

    动态维护全局最大值dpmax,避免遍历最终数组


易读注释版代码:

class Solution {
public:
    int num1[10001]; // 预处理数组:索引为数字,值为该数字总和
    
    Solution() { // 初始化数组清零
        for (int i = 0; i < 10001; i++) {
            num1[i] = 0;
        }
    } 
    
    int deleteAndEarn(vector<int>& nums) {
        // 预处理阶段:聚合相同数字的总和
        for (int i = 0; i < nums.size(); i++) {
            num1[nums[i]] += nums[i]; // 累加相同数字的值
        }
        
        // 动态规划初始化
        int dp[10001];
        dp[0] = num1[0];                  // 只有数字0可选时的收益
        dp[1] = max(num1[0], num1[1]);    // 0和1互斥,取较大者
        dp[2] = max(num1[0] + num1[2], num1[1]); // 三种情况比较
        int dpmax = dp[2];                // 初始化当前最大值
        
        // 递推求解
        for (int i = 3; i < 10001; i++) {
            // 状态转移核心:比较两种跨步方案
            dp[i] = max(dp[i - 2] + num1[i], // 方案一:隔两数选当前
                        dp[i - 3] + num1[i]);// 方案二:隔三数选当前
            dpmax = max(dpmax, dp[i]);       // 更新全局最大值
        }
        
        return dpmax; // 返回历史最大收益
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣198.打家劫舍|动态规划解法中的特殊边界处理

力扣198.打家劫舍|动态规划解法中的特殊边界处理

题意解析:在排列成直线的房屋群中,每个房屋藏有价值不同的财物。小偷不能连续抢劫相邻的两间房屋,否则会触发警报。我们需要设计一套抢劫策略,使得在不触发警报的前提下,能够获取的最大财物总和。这个问题本质上...

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

题目重解想象你是一名药师,有t分钟在山上采集m种草药。每种草药需要time分钟采集,价值为num。这就像考试时分配时间做题,要选择收益最大的题目组合。题目要求计算在规定时间内能获得的最大草药价值。解题...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

力扣94:递归之美 轻松掌握二叉树中序遍历

力扣94:递归之美 轻松掌握二叉树中序遍历

题目解读二叉树的中序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。对于二叉搜索树,中序遍历的结果恰好是节点值的升序排列。给定一个二叉...

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

一、题目解读小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。