• 自然智慧去尝试,用数组做缓存—->傻缓存法
    • 自顶向下的动态规划,做一个傻缓存,不关心你的位置依赖,没算过就算然后存入表中,算过就直接返回表中的结果
    • 动态规划有省空间的方法
    • 自顶向下的动态规划—->记忆化搜索
    • 看哪两个参数可以代表返回值、决定返回值
    • 动态规划是结果不是原因!!!—->缓存的结果!
    • 你的尝试策略就是状态转移的东西—->一码事
    • 状态转移是结果不是原因,不要去背转移方程
    • 尝试策略和状态转移是一码事
    • dp是数学含义(方便dp进行下去),而实际意义中要对边界进行判断,使结果符合现实情况
    • 无效参数的检查
    • 能做严格位置依赖(dp数组)的就做,做不了的就用傻缓存
    • 能做一定要做—->因为还有好多优化是基于严格位置依赖得出的(进一步时空优化!变种!)
    • 四种模型:
      • 从左到右—->背包
      • 范围—->拿牌博弈
      • 样本对应—->最长公共子序列
      • 业务限制
    • 样本对应模型一般就考虑当前的结尾该如何组织可能性!!
    • 在方法中调用的递归方法就是严格依赖的那些位置!!!!
    • 一个样本做行一个样本做列的工程模型时就用样本对应模型—->以结尾来组织可能性
      • 必须含有,必须不含有
      • 可能考虑,必须不考虑
      • ……
      • 之前有0的可能性都是可以直接算
      • 到时候考虑到后面了,之前的就全是算过了的
    • 尝试策略—->自然智慧!!!
    • 国内的知识来自于继承,国外的知识来自于思辨;没有好坏,应该取彼之长;学求知,不能太功利(接地气,不能什么时候都依赖这个)—->物理系的要去读牛顿日记!!!
    • 先尽量把所有的base case写清楚,之后搞一般情况的时候再去看能不能合并
    • 样本对应模型特别注意样本的结尾怎么样;而范围模型特别注意样本的开头和结尾怎么样(开头结尾共同结合的)
      • 经验—->往上靠——->可能
        • 不以L和R做边界
        • 以L做边界,不以R做边界
        • 不以L做边界,以R做边界
        • 以L和R做边界
    • 一般求最值会有min/max方法,而求种数一般会有+=
    • 用对角线的(N,N)坐标来进行转移!—->不同的问题角度!—->正常视角下的斜线填法
    • 严格位置依赖!!!——>建立空间感——>方便优化
    • 动态规划一定可以用递归改过来,但是不是所有的递归都可以改成动态规划
    • 递归大于动态规划,不是所有的递归都属于动态规划
    • 严格位置依赖——->建立空间感之后要进行空间上的优化—->一般空间上的优化还是小优化,优化的是常数时间;有些优化是可以把很麻烦的枚举省掉
    • 最长公共子序列和回文串都可以解,所有一道题可能有多种尝试,要学会去尝试(多种方案)
    • 阿尔法狗是不是用的递归
    • 只要会写尝试就啥都有了
    • 三维dp的时候,只有在简单依赖的时候才会去修改成dp,假如依赖太过于复杂的时候,直接使用记忆化搜索(傻缓存)即可,爱怎么样怎么样
    • 比暴力快多了
    • 时间复杂度O(8K)—->O(90K)

    image.png

    • 加缓存的时间复杂度和严格位置依赖的一样—->本题《马走日》(都比直接暴力递归好)
    • 也有加缓存不如严格位置依赖的题目!!!
    • 举几个例子发现对;对数器要用两种截然不同的方法,不能有互相依赖!
    • 觉得难以改成dp,就直接用记忆化搜索(傻缓存),不改成数组了
    • 空间感怎么建立?—->格子画出来找感觉;简洁、方便、直观、可以很方便的写出来!!!
    • 木桶原理?—->泡咖啡+洗杯子
    • 限制不够,业务来凑
    • pick一下?????—->if判断?
    • 业务限制最差情况估,频繁(平凡?)解估计
    • dp表中不可能出现的情况可以不必填—->某些状态是用不着的!!!就比如范围类型的时候(L,R)只存在右上半三角的状态;而在咖啡题目中,所有的杯子都拿去洗的话最晚100min,此时假如判断到第五杯的时候完全不可能要等到100min的时候才能继续下去,这种情形必然不会在递归中出现;任何一杯咖啡都不能让洗咖啡的机器空余在100min以外
    • 有些位置是不需要填的—->没必要+越界
    • 实在改不出严格位置依赖的就用傻缓存—->用hash表做傻缓存,不需要考虑位置上的依赖了!