动态规划的时间复杂度优化

作者推荐

视频算法专题

本文涉及知识点

动态规划汇总

优化动态规划的时间复杂度,主要有如下几种:

一,不同的状态表示。

比如:n个人,m顶帽子。
第一种方式:dp[i][mask] ,i表示前i个人已经选择帽子,mask 表示 那些帽子已经选择。 空间复杂度:O(n2m)。
第二种方式:dp[i][mask] ,i表示前i个帽子已经选择,mask表示那些人已经选择。 空间复杂度:O(m22)。
n大,则现在方式一;否则选择方式二。

【状态压缩】【动态规划】【C++算法】1125.最小的必要团队

二,通过优化状态减少状态数

例一

【动态规划】【C++算法】2518. 好分区的数目
num的长度 ∈ \in [1,1000],num[i] ∈ \in [0,106] k ∈ \in [0,1000]。
将num的元素放到两个数组中,两个数组的和都为k。
由于num[i] >=0,所以 数组和已经大于k 的无论如何都不会等于k,抛弃。
dp[k1][k2] 的状态数是固定。
当处理完 n u m [ 0 , i ) 时 , 两个数组的和是固定 ⟺ k 1 + k 2 ≡ ∑ j : 0 i − 1 n u m s [ j ] 当处理完num[0,i)时,两个数组的和是固定 \iff k1+k2 \equiv \sum\Large_{j:0}^{i-1} nums[j] 当处理完num[0,i),两个数组的和是固定k1+k2j:0i1nums[j]
我记录k1或k2就可以了。新问题是k1 可能是5e8。
{ k 1 k 1 < k − m i n ( k 2 , k ) e l s e \begin{cases} k1 & k1 <k \\ -min(k2,k) & else \\ \end{cases} {k1min(k2,k)k1<kelse

例子二

2742. 给墙壁刷油漆
付费工人,各任务用时time[i],免费工人用时1,time.length ∈ \in [1,500]。付费工人用时和必须大于等于免费工人用时。如果分别记录付费工人和免费工人用时,则状态数:500*500。
付费工人用时和必须大于等于免费工人 ⟺ \iff (statu = 付费工人用时 - 免费工人用时) >= 0
statu ∈ \in [-500,500] 可以记录状态的时候+500,解析状态的时候再-500。

三 通过优化转移方程

转移方程主要有两种:
a,枚举前置状态,更新后置状态。除剪枝小幅提升性能外,暂时没发现优化方法。
b,枚举后置状态,通过前置状态计算后置状态。利用前缀和、极值、优先队列(堆)、单调栈(队列、向量)、预处理 等优化。

2617 网格图中最少访问的格子数两种方法:分别用单调栈、优先队列优化
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组前缀和
【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II枝小幅提升性能
【动态规划】【C++算法】1563 石子游戏 V极值

四 匹配无限次可以拆分成匹配0次和1次

以通配符为例。
abc 匹配 *
初始匹配长度0
处理* :
长度0的后置状态:*不匹配任何字符,匹配长度0。
长度0的后置状态:*匹配一个字符,匹配长度1。
长度1的后置状态:*不匹配任何字符,匹配长度1。
长度1的后置状态:*匹配一个字符,匹配长度2。
⋮ \quad \quad \vdots
总计: *可以匹配0到无限字符,才可以这样处理。 .只能匹配一个字符不能这样处理。

【动态规划】【字符串】C++算法:正则表达式匹配

【状态压缩】【动态规划】【C++算法】691贴纸拼词
【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字
【动态规划】【C++算法】2188. 完成比赛的最少时间

五 逆向思考

【动态规划】【 矩阵】【逆向思考】C++算法174地下城游戏
正向思考:要记录进入(r,c)后的健康,还有记录初始健康。比如:路径一: 3 → \rightarrow -2 ,初始只需要1,最终健康2。
路径二: -1 → \rightarrow 4 ,初始要求 2,最终健康度 5。如果终点格是-1,前者能过。 如果是-4,后者能过。前者需要4,才能过。
{ 路径一初始 1 ,路径二初始 2 终点 < − 1 路径一初始 4 ,路径二初始 2 终点 − 4 \begin{cases} 路径一初始1,路径二初始2 & 终点< -1 \\ 路径一初始4,路径二初始2 & 终点-4 \\ \end{cases} {路径一初始1,路径二初始2路径一初始4,路径二初始2终点<1终点4

【动态规划】【C++算法】741摘樱桃

六 去掉重复

【动态规划】C++算法:403.青蛙过河

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 **C+

+17**
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/492177.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光量子计算公司ORCA将在英国国家量子计算中心部署量子计算测试平台

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;800字丨7分钟阅读 全栈光量子计算系统公司ORCA Computing 将为英国国家量子计算中心&#xff08;NQCC&#xff09;搭建量子计算测试平台并提…

滑坡识别摄像头:减少灾害风险的新利器

近年来&#xff0c;滑坡灾害频发&#xff0c;给人们的生命和财产安全带来了严重威胁。为了及早发现滑坡迹象并采取有效措施减少灾害风险&#xff0c;科学家们研发出了滑坡识别摄像头&#xff0c;成为监测、预警和防范滑坡灾害的新利器。 滑坡识别摄像头主要通过安装在潜在滑坡区…

复旦大学最新研究发现,壳聚糖可延缓卵巢衰老

卵巢是哺乳动物的早期衰老器官之一&#xff0c;表现为卵泡数量减少&#xff0c;卵母细胞质量和数量下降。 卵巢微环境中与年龄相关的变化与女性生育能力受损有关&#xff0c;巨噬细胞在卵巢组织稳态和免疫监视中起着重要作用。然而&#xff0c;衰老对卵巢巨噬细胞功能和卵巢稳…

java回顾总结--泛型

目录 一、示例1.1 为什么需要泛型1.2 泛型类和泛型接口的定义1.3 泛型方法辨析1.4 限定类型变量1.5 泛型中的约束和局限性1.6 泛型类型的继承规则1.7 通配符类型1.7.1 &#xff1f;extends X:1.7.2 &#xff1f;super X:1.7.3 无限定的通配符 ? 1.8 虚拟机是如何实现泛型的&am…

SpringBoot原理篇

文章目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 3.2.4 案例3.2…

【数据结构】排序(2)

目录 一、快速排序&#xff1a; 1、hoare(霍尔)版本&#xff1a; 2、挖坑法&#xff1a; 3、前后指针法&#xff1a; 4、非递归实现快速排序&#xff1a; 二、归并排序&#xff1a; 1、递归实现归并排序&#xff1a; 2、非递归实现归并排序&#xff1a; 三、排序算法…

栈和堆什么意思,Rust所有权机制又是什么

栈和堆什么意思 栈&#xff1a;存储基本数据类型和引用数据类型的指针引用(地址)&#xff0c;基本数据类型占据固定大小的内存空间。 堆&#xff1a;存储引用数据类型的值&#xff0c;引用数据类型包括对象&#xff0c;数组和函数&#xff0c;在堆中&#xff0c;引用数据类型…

springboot+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

前端工程化面试题 | 18.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【小沐学C++】C/C++包管理工具Conan使用(C++、Python、CMake、Conan)

文章目录 1、简介2、Conan下载安装3、Conan命令3.1 查看conan版本3.2 更新conan库3.3 搜索软件包3.4 显示conan所有源3.5 查看软件包3.6 通过conanfile.txt安装依赖包 结语 1、简介 Conan是C和C语言的依赖项和包管理器。它是免费和开源的&#xff0c;适用于所有平台&#xff0…

JSP实现数据传递与保存(二)

一、session对象 session机制是一种服务器端的机制&#xff0c;在服务器端保存信息用于存储与用户相关的会话信息 1.1 session与窗口的关系 每个session对象都与一个浏览器窗口对应&#xff0c;重新开启一个浏览器窗口&#xff0c;可以重新创建一个session对象&#xff08;不…

09 Redis之分布式系统(数据分区算法 + 系统搭建与集群操作)

6 分布式系统 Redis 分布式系统&#xff0c;官方称为 Redis Cluster&#xff0c;Redis 集群&#xff0c;其是 Redis 3.0 开始推出的分布式解决方案。其可以很好地解决不同 Redis 节点存放不同数据&#xff0c;并将用户请求方便地路由到不同 Redis 的问题。 什么是分布式系统?…