动态规划-学习记录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.寻找边界条件
参考资料
知乎-如何理解动态规划?
知乎-告别动态规划...
博客园-五大常用算法之二:动态规划算法
标签:台阶,记录,跳法,跳上,动态,规划,dp 来源: https://www.cnblogs.com/OtusScops/p/14675510.html