动态规划-学习记录1

目标

看了十二届蓝桥杯的大题,动态规划(Dynamic Programming)似乎用得很多,今天希望初步理解动态规划的思想,并能够利用它来解决相关简单问题

是什么

动态规划是求解最优解的过程,求解最优解这类问题一般都能用dp解决。

怎么做

dp没有统一的处理方法,必须根据问题的各种性质并结合一定的技巧来处理

这里为了方便理解,参考了知乎-告别动态规划...博客园-五大常用算法之二:动态规划算法

问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。

分析问题,可以发现以下几点:

1.要求该青蛙跳上一个n级的台阶总共有多少种跳法,只需求它跳上n-1级和n-2级台阶的跳法,相加即可

2.定义一个数组储存其跳法总数:dp[台阶级数] = 跳至该级台阶的跳法总数,那么以上关系即可表示为dp[n] = dp[n-1]+dp[n-2]。相应地,dp[n-1] = dp[(n-1)-1]+dp[(n-1)-2]......

3.依照这种关系递推下去,可得出初始时:dp[2]=2,dp[1]=1

以上这三点,对应着动态规划应用时的三个子目标:
1.建立状态转移方程
2.缓存并复用以往结果
3.寻找边界条件

以下是针对上面问题所作的c语言程序

#include <stdio.h> int main() { int dp[100] = {0,1,2};//求跳上第n个台阶的方法总数(n<100) int n,i; scanf("%d",&n);//输入台阶级数n (n<100) for(i = 3;i<=n;i++) { dp[i] = dp[i-1]+dp[i-2]; } printf("%d",dp[n]); return 0;

}

优点

动态规划和递归有类似之处,但动态规划可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,运用dp,可以拿空间换时间,有着递归不可比拟的优势。

总结

动态规划应用时的三个子目标:
1.建立状态转移方程
2.缓存并复用以往结果
3.寻找边界条件

参考资料

知乎-如何理解动态规划?
知乎-告别动态规划...
博客园-五大常用算法之二:动态规划算法


__EOF__

本文作者OtusScops
本文链接https://www.cnblogs.com/OtusScops/p/14675510.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   AshScops  阅读(83)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示