学习笔记1:动态规划

目录

一.什么是动态规划?

二.动规和回溯的关系?

三.动态规划真正的难点



一.什么是动态规划?

最近几个月学习了一点动态规划,在力扣上面刷题看到一些大佬的题解思路和本人查阅资料(其实是百度),最近又在知乎上面看到一个问题:

看了很多大佬的回答,感觉对动态规划这一个东西了解更深了(没错,更迷了)。

动态规划不同于其他算法,不是一个一成不变的算法,动态规划其实是一种方法、

有些算法,比如DFS、BFS算法,你甚至只需要去理解以后记住这个算法的模板,怎么去用,在哪些情况下用,以后遇到类似的问题,将模板转化一下就可以用了。但动态规划不是,这就是动态规划的迷雾所在,有些题你在看了题解以后发现这道题居然能够用动态规划的思路去做,你不禁感叹:动态规划真是好东西...

wiki上面对于动态规划的定义如下:

 

dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems, solving each of those subproblems just once, and storing their solutions.

动态规划是一种方法,用于解决复杂问题时将复杂问题转化为一个个相似的小问题,所有的问题都只需要计算一次,并且储存它们的解。


二.动规和回溯的关系?

当我刷了几道动规的题目以后,我越来越觉得这东西和回溯算法太相像,为什么这么说?且慢,来看一道fibonacci数列的题目,Fibonacci数列即F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(≥ 2,∈ N*)的这样一个数列。在刚刚开始学习C语言的时候,老师花了很大功夫用这个例子来讲递归。给定一个数,从开始输出Fibonacci数列到第N个数。根据上面那个公式,n>=2时,F(n)只与n前两位的数有关,即,如果我们要求F(20),我们需要知道F(19)和F(18)

if(x == 1 || x == 2 ){
		return 1;
	}else{
		return fun(x - 1) + fun(x - 2);
	}

用动态规划的方法,我们需要一直从上往下求,直到到达我们设定的base case。很明显,在求F(19)的时候,我们依然要求一次F(18),继续上面的方法,从上面走到底,获得F18的结果。也就是说,求F(20),其实我们可以说成我们求的是F(1)... F(19),因为最终的大问题的结果来源于这些小问题

你可能烦了,F18我们不是求过一次了吗,现在何必再来求呢?我们第一次求到F18的时候把它结果保存起来,当要用到F18的时候再用我们已经储存的值不就行了吗?

其实我们的思考已经和动态规划挂钩了,只是很多时候没发现。先不说那些重叠子问题、无后效性等等概念,我们把这些结果储存起来,要用的时候直接调用,比刚刚那个递归节省了不是一点半点的时间。

那我们只需要改一下

int fibo(int n){
 	if(n < 1) return -1;
 	int F[n+1];
	F[1] = 1;
 	F[2] = 1;
 	for(int i = 3; i <= n; i++){
  		F[i] = F[i-1] + F[i-2];
 	}
 	return F[n];
}

这就是Fibonacci数列计算的动态规划版本了。

所以动规是一种聪明的遍历,而不是傻乎乎的遍历,在于他有记忆。


三.动态规划真正的难点

上面Fibonacci数列只是讲明动态规划的概念,其实在刷题时看见了题你还是想不到用动态规划,你还是会用傻乎乎的方法,傻乎乎的暴力搜索。(没错,是我了)

那么难点在哪呢?或者说动规的迷雾是什么?根据我刷了一点点题的经验告诉我,难点在于找状态之间的关系,然后找出一个普适的转移方程。

说实话,我一直觉得这有点靠直觉。

因为这涉及了DP数组的定义。

现有的结果怎么递推出下一个结果?如果没有方法可以解释所有的结果,一般来说是DP数组定义出现了错误。

这时候就需要我们重新找状态,然后重新定义DP数组,DP数组定义的根本原则就是能够让所有的小结果之间产生联系并且最终得到大结果。

定义了一个正确的DP数组以后,我们需要找到大问题和小问题之间的关系,即找这个状态转移方程,我觉得这里是最难的,因为很多情况下这个方程很反我们的第一感觉,或者说很反我们正常的思考方式,以至于我们很难想到一个普适的状态转移方程。对于这一点,还需要大量刷题来找到感觉。(比如我,题没刷多少就来写笔记了)

总之,如果一个问题能够将大问题转化为一个个相似的小问题,而且小问题的求解过程不会影响后续问题的结果发展,大问题的最优解能够从小问题的最优解中获得,那就能用动态规划。

“我是谁?我从哪里来?我要到哪去”

这依然是动态规划对人类的终极拷问。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值