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

如何思考一个动态规划问题需要几个状态?

如何思考一个动态规划问题需要几个状态?

  • 第一步:思考 角色
  • 第二步:考虑 过去的影响
  • 第三步:画出状态转移图
  • 第四步:写出状态转移方程
  • 第五步:验证是否能覆盖所有路径 + 边界
  • 几个常见题目
  • 总结:

第一步:思考 角色

问自己:我当前的状态可能有哪些不同的“角色”?

  • 比如买卖股票问题:

    • 有可能是持股、卖出、休息,→ 3 种角色
  • 背包问题:

    • 角色比较固定:容量 / 物品选择

状态数 ≈ 当前时刻下,决策行为或状态的枚举情况

第二步:考虑 过去的影响

问自己:我做一个动作,会不会受到前一天某种特定状态的限制?

  • 如果有“冷冻期”,说明不是所有状态之间都能直接转移 → 你就需要引入“冷冻”这个额外状态

  • 如果只有买卖无限制,两个状态就够(持股 / 不持股)

状态数 ≈ 为了准确区分不同限制路径,你需要多少“分支状态”来表示

第三步:画出状态转移图

手动画出:

  • 节点 = 状态

  • 边 = 状态转移(由什么转到什么)

如果画出状态图后,发现某个状态没有前驱或不影响结果,那说明可能是冗余状态,可以删去

第四步:写出状态转移方程

通过写递推公式,你会发现:

  • 如果公式里无法统一表达当前动作,可能因为状态粒度不够细

  • 如果写着写着发现状态分不清,可能因为状态定义太模糊,需要拆分更多状态

第五步:验证是否能覆盖所有路径 + 边界

确认:

  • 所有可能的行为(买、卖、等)都能用已有状态表示

  • 边界条件(第一天、最后一天)状态是否有明确初始化

几个常见题目

题目 / 问题类型状态数状态解释
买卖股票(无限次,无限制)2持股 / 不持股
买卖股票(含冷冻期)3持股 / 卖出 / 冷冻
买卖股票(最多两次)4第一次买 / 第一次卖 / 第二次买 / 第二次卖
0-1 背包问题1 或 2一维表示容量,或二维加物品维度
打家劫舍(不能偷连续两家)2偷/不偷

总结:

“状态由角色定,变化看限制,画出状态图看转移是否清晰,冗余是否可合并。”

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

相关文章:

  • J2EE模式---服务层模式
  • springboot基于Java与MySQL库的健身俱乐部管理系统设计与实现
  • 【前后端】node mock.js+json-server
  • vscode找不到python解释器的解决方案
  • listen() 函数详解
  • Petalinux驱动开发
  • 多智能体系统设计:协作、竞争与涌现行为
  • 零基础学习性能测试第六章:性能难点-Jmeter实现海量用户压测
  • 【奔跑吧!Linux 内核(第二版)】第5章:内核模块
  • 关于“PromptPilot” 之2 -目标系统:Prompt构造器
  • Linux c网络专栏第三章DPDK
  • Rust与Java DynamoDB、MySQL CRM、tokio-pg、SVM、Custors实战指南
  • UV: 下一代 Python 包管理工具
  • Unity 实时 CPU 使用率监控
  • 前缀和-560.和为k的子数组-力扣(LeetCode)
  • XFile 系统架构设计文档
  • iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术
  • 七、搭建springCloudAlibaba2021.1版本分布式微服务-skywalking9.0链路追踪
  • 前端基础班学习路线
  • GPGPU基本概念
  • PiscCode实现从图像到字符艺术
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现PCB上二维码检测识别(C#代码UI界面版)
  • 北大区块链技术与应用 笔记
  • 虚拟机ubuntu20.04共享安装文件夹
  • AI驱动的金融推理:Fin-R1模型如何重塑行业决策逻辑
  • docker搭建部署 onlyoffice 实现前端集成在线解析文档解决方案
  • elasticsearch 倒排索引原理详解
  • LeetCode 923.多重三数之和
  • 面试150 数字范围按位与
  • 第六章 JavaScript 互操(3)JS调用.NET