动态规划——一文看懂动态规划的本质
动态规划通常是一个很难的问题。我先分享一个大V写的文章,大家可以看看人家对于动态规划的理解:
这篇文章里里面:给出了很重要的点:面对一个动态规划问题:
第一步:
是最重要的一步:定义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。
上述三步做完,基本大功告成!
stay foolish,stay hungry