leetcode之动态规划(DP)总结(C++)

基础知识:

       dp问题归根结底是寻找规律,总结出在各种不同情况下的数学表达式。是一种自下向上的设计,先解决子问题,然后将所有子问题的解决方式联合起来,最终解决问题。一般的思维步骤如下:

       1.判断是否为DP问题。两个条件:1.最优子结构;2.重叠子问题。解释下两个条件的含义,最优子结构指的是在计算f(n)的时候,f(n-1)子结构已经达到的题目要求的最优状态。重叠子问题是指在解决f(n)的时候,需要用到f(n-1)的结果。

        2.写出状态转移方程。这个步骤是DP问题的灵魂所在,不要想着一下子去解决整个问题,首先冷静分析一下某一个小问题遇到的所有情况是怎样的,分析清楚之后,将其描述成数学表达式,一般使用f(n)函数来表示当前状态。利用f(n)将前面解决的问题结果和当前结果联系起来。编写状态转移方程。(因为总结状态转移方程其实是一个填表的过程,先建立一个表格,然后按照表格来总结状态转移方程,一维的容易直接看出来,二维的肯定是要建立表格分析)

        3.第三步也蛮重要。根据状态转移方程选择某种数据结构。一般选的比较多的是一维和二维数组,不是绝对的,还有些需要选择多种数据结构进行辅助,例如剑指offer  “最长不含重复字符的子字符串”这道题,需要一个普通变量以及哈希表进行辅助。要根据具体转台转移表达式以及题目需求进行选择。

         4.第四步也很重要。因为DP问题的解决思路是从下往上,所以它依赖于前面的结果,那么在计算之前,就需要进行状态方程状态初始化。

 

下面是力扣1-150中的动态规划题:

 

博客连接:

3.无重复字符的最长子串:https://blog.csdn.net/L_smartworld/article/details/106496478
53.最大子序和:https://blog.csdn.net/L_smartworld/article/details/106958590
62.不同的路径:https://blog.csdn.net/L_smartworld/article/details/107160706
63.不同的路径II:https://blog.csdn.net/L_smartworld/article/details/107162108
64.最小路径和:https://blog.csdn.net/L_smartworld/article/details/107163384
70.爬楼梯:https://blog.csdn.net/L_smartworld/article/details/107184985
91. 解码方法:https://blog.csdn.net/L_smartworld/article/details/107341764
115.不同的子序列:https://blog.csdn.net/L_smartworld/article/details/107467850
120.三角形最小路径和:https://blog.csdn.net/L_smartworld/article/details/107492973

 

剑指offer:
46题:把数字翻译成字符串:https://blog.csdn.net/L_smartworld/article/details/106374316
60题:n个骰子的点数: https://blog.csdn.net/L_smartworld/article/details/106353975

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值