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

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

4个月前 (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; // 返回历史最大收益
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

一、题目解读CSP-J 2019年的“公交换乘”题目(洛谷P5661)要求模拟地铁与公交交替出行的费用计算。题目核心在于地铁消费会产生优惠券,而公交可在45分钟内使用优惠券抵扣车费。需要处理n条出行记...

洛谷2789题解:直线交点数的递归求解与优化(附代码详解)

洛谷2789题解:直线交点数的递归求解与优化(附代码详解)

一、题目解读洛谷2789题要求计算n条直线在平面上两两相交时产生的不同交点数量。题目强调“不同”交点,需排除重复情况。解题关键在于如何高效枚举所有可能的交点组合,并避免重复计数。二、解题思路参考代码采...

力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧

力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧

一、题目解读力扣931题「Minimum Falling Path Sum」(最小下降路径和)要求在一个n x n的整数矩阵中,计算从顶部到底部的最小路径和。路径只能从每个位置向下或对角线移动(即向下...

牛客25461题解析:花园喷泉距离优化算法(动态规划+后缀数组解法)

牛客25461题解析:花园喷泉距离优化算法(动态规划+后缀数组解法)

一、题目解读牛客25461题要求计算一个花园中n朵花到两个喷泉的最小距离平方和。用户需输入喷泉坐标(x1,y1)和(x2,y2),以及n朵花的坐标(x,y),通过合理分配每朵花到两个喷泉的距离,使总距...

牛客网288555题解题指南:动态规划求解小红的暑假(附代码解析)

牛客网288555题解题指南:动态规划求解小红的暑假(附代码解析)

一、题目解读牛客网288555题要求解决一个组合数学问题:有三位朋友,每天需邀请其中一位参加聚会,但不能连续两天邀请同一位朋友。给定天数n,求满足条件的不同邀请方案总数。题目考察动态规划、状态转移及组...

洛谷P10472题解:利用栈求解最长有效括号

洛谷P10472题解:利用栈求解最长有效括号

一、题目解读洛谷P10472题要求计算给定字符串中最长有效括号的长度。有效括号指括号成对匹配(如"()[]{}"),子串需连续且内部嵌套正确。题目核心在于判断括号匹配的连续性,并找...

发表评论

访客

看不清,换一张

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