漫画:5分钟了解什么是动态规划?

本文深入讲解动态规划(DP)的概念,解析其核心要素包括最优子问题、边界条件及状态转移方程,通过实例剖析动态规划如何高效解决多阶段决策问题。并探讨其在01背包问题和最长公共子序列问题等经典场景的应用。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

动态规划,英文是Dynamic Programming,简称DP,擅长解决“多阶段决策问题”,利用各个阶段阶段的递推关系,逐个确定每个阶段的最优决策,并最终得到原问题的最优决策。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg

注意:动态规划往往使用表格来存储中间结果

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg

注意:每一步上几层台阶,都是一个决策问题!

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

说到这里,阿广你有没有发现几点问题?

1、将求F(10)这个问题,完美的分解成了F(9)和F(8),找到了局部的最优解,与贪心算法有点像呀。

2、既然F(10)=F(9)+F(8),那么F(9)=F(8)+F(7),依此类推,最终问题被逐渐降低了规模,越来越简单,这也是分治算法的思想。

640?wx_fmt=png

动态规划的三要素:

1、最优子问题

F(10)=F(9)+F(8),就是F(10)问题的最优子问题,局部的贪心完美的将问题分解,如果得到的F(9)和F(8)都是最优解,那么F(10)一定也是最优解了。

2、边界条件

分解到最后,一定是变成了规模最简单的问题,即F(1)和F(2),这两个问题不能再分解了,不过没关系,他们很简单,用你的小心心算就ok了。

3、状态转移方程(DP方程)

本问题的状态转移方程为:F(n)=F(n-1)+F(n-2),这就是解决问题的核心,使得状态能够“动”起来。

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg

注意:相同颜色的部分代表相同的结果

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

可以看出来,动态规划算法的核心是DP方程。

所以说,状态转换方程(DP方程)就是算法的核心,那么设计DP方程,要有什么注意的呢?以下列出来几点!

1、最优化子问题

从上面的算法三要素中,可以看出,DP方程是最优子问题中归纳而来的。那么,什么才算“最优子问题”呢?就是说,不管之前决策是否是最优决策,都必须保证从现在开始的决策是在之前的基础上最优。具体的说,我们默认F(8)和F(9)就是最优的,在此基础上,得到最优的F(10)。

2、不影响后续决策

由于上一条我们看到,如果F(8)的决策会影响到F(9)和F(10)的决策,那么F(10)=F(9)+F(8)就不成立了,所以,要一定保证,每个阶段的决策仅受之前决策的影响,但不影响之后阶段的决策。

640?wx_fmt=png

典型应用1---01背包问题

640?wx_fmt=png

640?wx_fmt=png

01背包问题的决策,就是判断第i件物品,装还是不装,哪种决策总价值最大?

那么,我们是否能够定义状态为s[i]呢,用来表示第i件物品决策的最大价值?

答案是不可以的,因为这个状态会影响到后面的决策,换种说法讲,装不装入一个物品,会影响到背包中的剩余空间,所以后面的决策当然会受影响。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

典型应用2---最长公共子序列问题(这一问题常被用于比较“相似度”)


640?wx_fmt=png

决策方式就是判断str1[i]和str2[j]的关系,关系不同,则DP方程不同。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

---END---

往后余生,如果你想为所爱之人遮风挡雨,可以关注她。

你的转发和在看是创作最大的动力?

内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值