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


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

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

  • 相关阅读:
    Delphi中的接口和抽象类
    设计模式之六大原则
    C 标准库
    linux 管道和重定向
    linux c创建静态库(.a)
    一个C语言程序
    C#动态创建lambda表达式
    linq中order by 和group by (含lambda表达式实现)以及综合案例
    微信扫码登陆原理
    二维码扫码支付原理
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12577296.html
Copyright © 2020-2023  润新知