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

信奥赛CSP小学五年级动态规划入门


小学五年级动态规划入门


一、用生活例子引入动态规划

例子:存钱罐的秘密
小明有一个存钱罐,每天可以存1元或2元,他想知道存满5元有多少种不同的存法。

  • 问题分解
    • 存到1元:只有1种方法(每天存1元)。
    • 存到2元:2种方法(1+1 或 直接存2元)。
    • 存到3元:存到1元的方法数 + 存到2元的方法数 = 1 + 2 = 3种。
  • 规律当前问题的解 = 前面子问题的解之和
  • 动态规划的核心:记住每一步的结果,避免重复计算!

二、动态规划概念
  • 动态规划(DP):将大问题拆成小问题,通过解决小问题逐步解决大问题,并记录每个小问题的答案。
  • 关键思想
    1. 递推关系:当前答案如何由前面的答案推导出来。
    2. 记忆化存储:用数组或表格记录每一步的结果,避免重复计算。

三、从递推到动态规划的过渡
1. 递推算法举例:斐波那契数列
  • 问题:求第n个斐波那契数(1, 1, 2, 3, 5, 8…)。
  • 递推公式f(n) = f(n-1) + f(n-2),初始条件 f(1)=1, f(2)=1
  • 问题:直接递归会重复计算(如计算f(5)需要f(4)和f(3),而f(4)又需要f(3)和f(2))。
2. 动态规划优化:记忆化存储
  • 用数组保存结果:计算过的值不再重复计算。
  • 代码对比
    // 递推(递归,低效)
    int fib(int n) {if (n == 1 || n == 2) return 1;return fib(n-1) + fib(n-2); // 重复计算
    }// 动态规划(高效)
    int dp[100] = {0};
    int fib_dp(int n) {if (n == 1 || n == 2) return 1;if (dp[n] != 0) return dp[n]; // 直接返回已计算的值dp[n] = fib_dp(n-1) + fib_dp(n-2);return dp[n];
    }
    

四、动态规划的步骤实现

以“爬楼梯”问题为例(每次爬1或2阶,到第n阶的方法数):

  1. 定义状态dp[i]表示爬到第i阶的方法数。
  2. 状态转移方程dp[i] = dp[i-1] + dp[i-2](从i-1阶爬1步,或从i-2阶爬2步)。
  3. 初始条件dp[1] = 1, dp[2] = 2
  4. 计算顺序:从小到大依次计算 dp[3], dp[4], ..., dp[n]

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

相关文章:

  • Agent模型微调
  • Android应用中设置非系统默认语言(java)
  • 基于Python的全卷积网络(FCN)实现路径损耗预测
  • 网络安全--PHP第二天
  • 【前端设计模式讲解】工厂模式
  • lc hot 100之:多数元素
  • PPT连同备注页(演讲者模式)一块转为PDF
  • 计算机视觉(图像算法工程师)学习路线
  • 有趣有用的小发现
  • C#创建桌面快捷方式:使用 WSH 实现快捷方式生成
  • 接口性能测试-基于博客系统
  • 使用 Hyperlane 实现 WebSocket广播
  • RabbitMQ 可靠性保障:消息确认与持久化机制(二)
  • FFMPEG-AAC编码
  • 《分布式年夜》解析
  • 【Linux学习笔记】深入理解ELF和动静态库加载原理
  • c++学习之---stack,queue
  • Java 流程控制 switch:从实际场景出发掌握选择艺术
  • 详解Mysql redo log与binlog的两阶段提交(2PC)
  • 上海医日健集团社区 + 写字楼全域覆盖便民服务网
  • 如何在Windows右键菜单中添加“在此处以管理员身份打开Powershell窗口”的选项(含图标设置)
  • 论文阅读:arxiv 2024 SmoothLLM: Defending LLMs Against Jailbreaking Attacks
  • NNG和DDS
  • Ubuntu 22.04 高效Python依赖管理指南
  • 小程序使用web-view 修改顶部标题 安全认证文件部署在nginx
  • 疫情社区管理登记系统
  • 基于点标注的弱监督目标检测方法研究
  • springboot中拦截器配置使用
  • NeuralRecon技术详解:从单目视频中实现三维重建
  • 「OC」源码学习——KVO底层原理探究