动态规划——一文看懂动态规划的本质

动态规划通常是一个很难的问题。我先分享一个大V写的文章,大家可以看看人家对于动态规划的理解:

https://www.zhihu.com/question/23995189/answer/1094101149?utm_source=com.tencent.tim&utm_medium=social&utm_oi=732325277794836480

这篇文章里里面:给出了很重要的点:面对一个动态规划问题:

第一步:

是最重要的一步:定义d[i](一维动态规划)或者d[i][j]并清楚的知道其含义!这一步,很重要,有的题目可以直接看出,有的题目则需要我们去自己挖掘提炼

第二部:

定义状态转移方程:

对于一维的动态规划,也就是d[i]和d[i-1]或者进一步的d[i-2](通常来说是d[i]和d[i-1],d[i-2]的关系)的关系;

对于二维动态规划,就是d[i][j]同d[i-1][j-1]或者d[i][j-1]或者d[i-1][j]或者d[i-1][j+1]或者d[i+1][j-1]的关系。

也就是,本质上,是定义当前状态和邻近状态的转移关系。这里我们需要充分认识到,由于d[i]或者d[i][j]的含义是确定的,所以当前状态和其上一个状态描述的物理意义是一样的

第三步:

根据状态转移关系确立边界:

通常对于一维的情况,会确立d[0],d[1];对于二维的情况,会确立d[0][0...n-1]和d[0...n-1][0],或者d[i][i](对角线),也就是对于二维而言,通常确立的边界是首行首列或者对角线(二维dp是一个矩阵)

上述三步的顺序请不要搞错了,严格按照上述三步求解动态规划问题!!!!

经验:大部分的题目通常需要二维的dp,尤其是涉及到字符串的问题,百分之九十都是二维的dp;数组类的通常是一维dp。

上述三步做完,基本大功告成!

原文地址:https://www.cnblogs.com/shaonianpi/p/12577296.html