zoukankan      html  css  js  c++  java
  • 动态规划——一文看懂动态规划的本质

    动态规划通常是一个很难的问题。我先分享一个大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。

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

  • 相关阅读:
    大三进度条01
    阅读笔记01
    问题账户需求分析
    《人月神话》阅读笔记02
    《人月神话》阅读笔记01
    每周总结(第五周)
    《构建之法》阅读笔记06
    《构建之法》阅读笔记05
    《构建之法》阅读笔记04
    《构建之法》阅读笔记03
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12577296.html
Copyright © 2011-2022 走看看