动态规划-学习记录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.寻找边界条件

参考资料

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

posted @ 2021-04-19 09:22  AshScops  阅读(76)  评论(0编辑  收藏  举报