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

动态规划问题 -- 多状态模型(删除并获得点数)

目录

  • 动态规划分析问题五步曲
  • 题目概述
    • 预处理阶段
  • 代码编写

动态规划分析问题五步曲

不清楚动态规划分析问题是哪关键的五步的少年们可以移步到
链接: 动态规划算法基础
这篇文章非常详细的介绍了动态规划算法是如何分析和解决问题的

题目概述

链接: 删除并获得点数
在这里插入图片描述

预处理阶段

分析题目要求,发现nums中的每一种数都存在删除并获取其点数和不删除直接跳到后续的操作 ,确定本题用一个dp表是解决不了问题的是一个多状态的dp问题

对麻烦的下标映射进行预处理,以方便未来动态规划

看到实例2,删除3则要去删除前面所有2和4。如果未来nums数组很长呢那么呢?想要控制 下标达成题目中:每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素”的要求的下标控制非常困难

解决方案,不妨把所有相同的值合并在一起,并新建一个数组这个数组的下标表示 nums中的元素值:price[i] 表示nums中等于i的所有元素之和

nums = [2,2,3,3,3,4] -> price = {0,0,4,9,4};
(可见数组newnums的大小应该为nums的最大值+1

预处理完成后,分析第i个位置时,就只需要控制i位置相邻的下标了!!!

  1. 状态表示(题目要求+自己的经验)
    本题状态:
    deleteNums[i] :表示到第i位置并且删除获得i位置的点数,能获得的最大点数
    NoDeleteNums[i] : 表示到第i位置并且不删除该位置,能获得的最大点数
  1. 状态转移方程推导
    从预处理后的nums,price的第i个位置进行分类讨论
    轻松得出状态转移方程
    在这里插入图片描述
  1. 初始化(防止越界+结合状态表示初始化)
    根据状态转移方程,当i = 0时会发生,越界
    因为题目已经说明nums[i] >= 1 ,因此price[0] = 0
    那么deleteNums[0] = deleteNums[0] = 0;
  1. 填表顺序(分析要填i位置前一个依赖状态的位置)
    本题两个表显然都是从左到右填表
  1. 返回值(由题目要求来)
    根据两个状态表的状态表示
    return max(deleteNums[n-1] , NodeleteNums[n-1]) ;

代码编写

有了动态规划五步曲我们就可以写出非常优雅的代码了

 int deleteAndEarn(vector<int>& nums) {int numsMax = INT_MIN;for(auto& e : nums)numsMax = max(numsMax,e);int n = numsMax + 1;vector<int> price(n); // 开最大值加一个大小1for(auto& e : nums)price[e] += e;vector<int> DeleteNums(n);vector<int> NoDeleteNums(n);for(int i = 1 ; i < n ; i++){DeleteNums[i] = NoDeleteNums[i-1] + price[i];NoDeleteNums[i] = max(DeleteNums[i-1],NoDeleteNums[i-1]);}return max(DeleteNums[n-1],NoDeleteNums[n-1]);}

少年,今天你又进步了一点点哟,明天继续加油吧
在这里插入图片描述

http://www.xdnf.cn/news/6404.html

相关文章:

  • 【python】windows实现与k230使用socket通信并传输文件
  • 第二十四天打卡
  • AVLTree的模拟实现
  • 内存分配器ptmalloc2、tcmalloc、jemalloc,结构设计、内存分配过程详解
  • Cesium.Ray 知识详解,示例代码
  • 实验六:按键模拟控制实现
  • Java—— 可变参数、集合工具类、集合嵌套、不可变集合
  • 十个免费试用的云数据库
  • Awesome WM自定义菜单实现nas共享目录挂载
  • K8S Ingress 实现AB测试、蓝绿发布、金丝雀(灰度)发布
  • 基于大模型预测的全面惊厥性癫痫持续状态技术方案大纲
  • 力扣-98.验证二叉搜索树
  • C# winform 日志 NLog
  • 【vue】脚手架
  • 瀑布模型VS敏捷模型VS喷泉模型
  • 【Linux】多路转接epoll、Linux高并发I/O多路复用
  • SpringAI
  • 印度尼西亚数据源对接技术指南
  • YOLOv11融合[CVPR2025]OverLock中的模块
  • 合并有重叠的时间区间的极简方法
  • 【证书与信任机制​】​​SSL证书类型全解析:DV、OV、EV的区别与应用场景
  • 【C#基础】集合.Any() 与 判断集合的长度有啥区别?
  • atoi函数,sprintf函数,memcmp函数,strchar函数的具体原型,功能,返回值;以及使用方法
  • 现代计算机图形学Games101入门笔记(六)
  • 19、云端工业物联网生态组件 - 工厂能效与预测维护 - /数据与物联网组件/cloud-iiot-factory-analysis
  • 紫外波段太阳光模拟器介绍
  • Python Matplotlib 库【绘图基础库】全面解析
  • 在UI 原型设计中,交互规则有哪些核心要素?
  • 数据统计分析及可视化
  • 开源 Web Shell 工具