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

第十七次博客打卡

今天学习的内容是动态规划算法。

 动态规划算法(Dynamic Programming,简称 DP)是一种通过将复杂问题分解为更小的子问题来求解的算法思想。它主要用于解决具有重叠子问题和最优子结构特性的问题。

 

 

一、动态规划的基本概念

 

 

1. 最优子结构

 

  一个复杂问题的最优解可以由其子问题的最优解组合而成。换句话说,问题的最优解包含其子问题的最优解。例如,在背包问题中,如果一个物品被选择放入背包,那么剩余容量下的最优解就是子问题的最优解。

 

2. 重叠子问题

 

  在求解过程中,相同的子问题会被多次计算。动态规划通过存储这些子问题的解(通常使用一个表格),避免重复计算,从而提高效率。例如,在计算斐波那契数列时,`F(n) = F(n-1) + F(n-2)`,如果不使用动态规划,会重复计算很多子问题。

 

 

二、动态规划的解题步骤

 

 

1. 定义状态

 

 状态是动态规划的核心,它表示问题的某个阶段的解。状态的定义需要满足两个条件:能够唯一表示问题的子问题,并且能够通过状态之间的关系推导出最终解。

 

2. 状态转移方程

 

 状态转移方程描述了状态之间的关系,即如何从已知的状态推导出新的状态。这是动态规划的关键部分。

 

3. 初始化

 

  确定动态规划的初始化。

经典问题

1.最长递增子序列(LIS)

 

• 给定一个序列,求其最长递增子序列的长度。例如,对于序列`[10, 9, 2, 5, 3, 7, 101, 18]`,最长递增子序列是`[2, 3, 7, 18]`,长度为 4。

 

• 状态定义:`dp[i]`表示以第`i`个元素结尾的最长递增子序列的长度。

 

• 状态转移方程:

\[

dp[i]=\max{0\le j<i\text{且}a_j<a_i}(dp[j]+1)

\]

其中,`a`是输入序列。

 

• 初始化:`dp[i] = 1`(每个元素自身可以构成长度为 1 的递增子序列)。

 

• 计算顺序:从`i = 0`到`n - 1`。

 

动态规划的优化技巧

 

 

1. 空间优化

 

• 在许多情况下,可以将二维动态规划表优化为一维数组。例如,在背包问题中,如果只关心最终结果,可以将`dp[i][j]`优化为`dp[j]`,通过从后向前更新`dp[j]`来避免覆盖问题。

 

2. 二分查找优化

 

• 在某些动态规划问题中,可以结合二分查找来优化状态转移。例如,在最长递增子序列问题中,可以使用二分查找来快速找到合适的插入位置,从而将时间复杂度从\(O(n^2)\)优化到\(O(n\log n)\)。

 

3. 滚动数组

 

• 当状态转移只依赖于前几行时,可以使用滚动数组来减少空间复杂度。例如,在二维动态规划中,如果状态转移只依赖于前一行,可以只使用两个一维数组交替更新。

 

动态规划是一种强大的算法思想,通过合理定义状态和状态转移方程,可以高效地解决许多复杂问题。

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

相关文章:

  • AZScreenRecorder最新版:功能强大、操作简便的手机录屏软件
  • 网络编程套接字
  • [白话文] 从百草园RLHF到三味书屋DPO
  • 全栈开发实战:FastAPI + React + MongoDB 构建现代Web应用
  • MCP协议:大模型与外部工具交互的标准化创新方案
  • 从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果
  • SpringBoot框架开发网络安全科普系统开发实现
  • 分布式事务快速入门
  • 小程序多线程实战
  • 功能齐全的菜谱管理器Tamari
  • [论文阅读]BadPrompt: Backdoor Attacks on Continuous Prompts
  • 23、Next.js:时空传送门——React 19 全栈框架
  • window 显示驱动开发-线性伸缩空间段
  • 简单网络交换、路由二
  • JavaWeb:JDBC
  • 关于ffmpeg的简介和使用总结
  • Kotlin Android LeakCanary内存泄漏检测实战
  • RT-Thread 深入系列 Part 5:物联网与网络应用实战
  • 视觉-语言基础模型作为高效的机器人模仿学习范式
  • 【STM32 学习笔记】I2C通信协议
  • STM32单片机的快速成长路径规划
  • 使用FastAPI和React以及MongoDB构建全栈Web应用04 MongoDB快速入门
  • 《React Native与Flutter:社交应用中用户行为分析与埋点统计的深度剖析》
  • 多层嵌套子查询
  • 区块链技术中的Java SE实战:从企业级应用到5大核心问题解析
  • 【Linux】用户管理
  • 【Docker系列】docker inspect查看容器部署位置
  • C++GO语言微服务之用户信息处理
  • Python爬虫实战:获取woodo网各类免费图片,积累设计素材
  • 计网学习笔记———网络