当前位置: 首页 > news >正文

力扣740. 删除并获得点数

动态规划

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

——————————————————————

http://www.lryc.cn/news/286456.html

相关文章:

  • spring和springboot的区别
  • imgaug库图像增强指南(35):【iaa.Fog】——轻松创建自然雾气场景
  • 网络安全--防御保护02
  • UE5 C++学习笔记 常用宏的再次理解
  • SpringBoot整合SSE
  • mysql-进阶篇
  • Js中的构造函数
  • [小程序]页面事件
  • vue echarts地图
  • v38.Switch语句
  • 如何进行产品的人机交互设计?
  • 【ARMv8M Cortex-M33 系列 7.3 -- EXC_RETURN 与 LR 及 PC 的关系详细介绍】
  • Linux之权限(内容详细,细节满满)
  • 了解云工作负载保护:技术和最佳实践
  • 【Godot4自学手册】第三节设置主人公的动画
  • excel学习1
  • 裁员致谷歌中国籍程序员身亡,技术变革下裁员对程序员的影响有多大
  • MybatisPlus的主键ID生成策略和公共字段自动填充的使用及注意事项
  • 【GitHub项目推荐--微软开源的可视化工具】【转载】
  • Python基础之文件操作(I/O)
  • k8s--helm
  • 算法训练营第五十六天|583. 两个字符串的删除操作 72. 编辑距离
  • 使用WAF防御网络上的隐蔽威胁之目录穿越
  • Linux:vim的相关知识
  • Qt 国产嵌入式操作系统实现文字转语音功能(ekho库)
  • Redis常见类型及常用命令
  • 实战纪实 | 某配送平台zabbix 未授权访问 + 弱口令
  • 【第十五课】数据结构:堆 (“堆”的介绍+主要操作 / acwing-838堆排序 / c++代码 )
  • 前端JavaScript篇之JavaScript有哪些数据类型,它们的区别?
  • LeetCode---380周赛