【动态规划专栏】专题三:简单多状态dp--------3.删除并获得点数

简介: 【动态规划专栏】专题三:简单多状态dp--------3.删除并获得点数


题目来源

本题来源为:

Leetcode 740. 删除并获得点数

题目描述

给你一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

题目解析

还是老样子,先做一下预处理:

我们将数组中的数保存在arr中,转化成一次“打家劫舍”问题

算法原理

1.状态表示

经验+题目要求

对于本题而言就是:

f[i]表示:选择到i位置时,nums[i]必选,此时能获得最大点数
g[i]表示:选择到i位置时,不选nums[i],此时能获得最大点数

2.状态转移方程

和之前一样:

在i位置选和不选两种情况

因此状态方程为:

f[i]=g[i-1]+nums[i];
g[i]=max(f[i-1],g[i-1]);

3.初始化

只有0位置会发生越界,初始化一下0位置即可

4.填表顺序

从左往右,两个表同时填

5.返回值

max(f[n-1],g[n-1])

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值

本题完整代码实现:

class Solution 
{
public:
    int deleteAndEarn(vector<int>& nums) 
    {
        const int N =10001;
        //预处理:
        int arr[N]={0};
        for(auto x:nums)
            arr[x]+=x;
        //创建dp表
        vector<int> f(N);
        vector<int> g(N);
        //初始化
        f[0]=arr[0];
        //填表
        for(int i=1;i<N;i++)
        {
            f[i]=g[i-1]+arr[i];
            g[i]=max(f[i-1],g[i-1]);
        }
        //返回值
        return max(f[N-1],g[N-1]);
    }
};
相关文章
|
6月前
|
算法
【动态规划专栏】专题一:斐波那契数列模型--------3.最小花费爬楼梯
【动态规划专栏】专题一:斐波那契数列模型--------3.最小花费爬楼梯
54 2
|
6月前
|
算法
【动态规划专栏】专题一:斐波那契数列模型--------2.三步问题
【动态规划专栏】专题一:斐波那契数列模型--------2.三步问题
40 3
|
6月前
|
存储 算法
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
57 1
|
6月前
|
算法 机器人
【动态规划专栏】专题二:路径问题--------5.最小路径和
【动态规划专栏】专题二:路径问题--------5.最小路径和
44 0
|
6月前
|
算法
【动态规划专栏】专题三:简单多状态dp--------2.打家劫舍II
【动态规划专栏】专题三:简单多状态dp--------2.打家劫舍II
52 0
|
6月前
|
算法
【动态规划专栏】专题二:路径问题--------6.地下城游戏
【动态规划专栏】专题二:路径问题--------6.地下城游戏
50 0
|
3月前
|
存储
LeetCode------递归(爬楼梯)
这篇文章通过LeetCode上的"爬楼梯"问题介绍了递归的基本概念和实现方法,包括递归公式的推导、基本递归实现、使用备忘录优化以避免重复计算,以及自底向上的迭代方法来提高效率。
LeetCode------递归(爬楼梯)
|
6月前
|
存储 算法
【优选算法专栏】专题九:链表--------两数之和
【优选算法专栏】专题九:链表--------两数之和
33 0
动态规划之----01背包题目解析
动态规划之----01背包题目解析
76 0
|
6月前
力扣每日一题 ---- 2918. 数组的最小相等和
力扣每日一题 ---- 2918. 数组的最小相等和