740. 删除并获得点数

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

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

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

来源:力扣(LeetCode)
 

动态规划

由题可知:当你选了一个数 x ,那么 x - 1 和 x + 1, 则不做选择

例如 ;nums = [1, 1, 2, 2, 2, 3, 3, 3, 3, 4]

当你选择 1 时, 0 和 2去除,我们发现,数据是一组一组的去除的,所以我们不妨申请一个新的数组 book 来记录每个数据出现的次数

例如 本例中 所匹配的 book = [0, 2, 3, 4, 1]

即 0 出现了 0 次, 1 出现了 2次, 2 出现了 3次 ......

可以联想到198. 打家劫舍 对 book 数组应用

状态方程为  dp[i] = max {dp[i - 2] + book[i]  * i, dp[i - 1]}

 

int 
deleteAndEarn(int* nums, int numsSize)
{
    int max = 0;

    for (int i = 0; i < numsSize; i ++)
    {
        max = fmax (max, nums[i]);
    }

    int sum[max + 1];
    memset (sum, 0, sizeof (sum));

    for (int j = 0; j < numsSize ; j ++)
    {
        sum[nums[j]] ++;
    }

    int *dp = (int *)malloc (sizeof (int) * (max + 1));
    dp[0] = sum[0] * 0;
    dp[1] = sum[1] * 1;
 
    for (int k = 2; k < max + 1; k ++)
    {
        dp[k] = fmax (dp[k - 2] + sum[k] * k, dp[k - 1]);
    }

    return dp[max];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的企鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值