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