第四步加上记忆化
给斐波那契加上记忆化(命中缓存不计数),把 fib(6) 的结果和调用次数用 / 拼起来输出——和上一步对比一下。 (本题用 g++ -std=c++17 -O0 编译。)
交付递归分治加记忆化
这是这条路线的最终作品。阶乘(记深度)、分治求和求最大、朴素斐波那契(计数)已经写好;补全记忆化斐波那契和循环版阶乘,然后一次验完五条:fact(5) 是 120 且最大深度 5;分治求和求最大都和标准库一致;朴素 fib(6) 是 8、调
check 为什么用随机数据
真机题的 ~/check 每次都现造随机数据来跑你的程序,主要是因为【0】。
递归快速幂补上出口
场景:实验机上 ~/work/rec/pow.cpp 用递归算 ab mod m,可一运行就崩溃(段错误)。 任务:给 pw 补上出口,让它对 b = 0 也算对。make 编译,./pow < sample.txt 自测。check
分治拆分别重复算中点
场景:~/work/rec/dsum.cpp 用分治求闭区间 [l, r] 的和,结果总是偏大,有的询问还会崩溃。 任务:修好拆分的那一句,让每个元素只被算一次。make 编译后用 sample.txt 自测;check 会用随机数组和随机
记忆化数组要先初始化
场景:~/work/rec/stairs.cpp 用记忆化递归数走楼梯的方法(一次走 1、2 或 3 级),可所有答案都是 0。 任务:修好它:用 -1 表示「还没算过」,那就得先把整个 memo 填成 -1。make 编译后用 sampl
补写分治求区间最大值
场景:~/work/rec/dmax.cpp 按询问求半开区间 [l, r) 的最大值,dmax 的拆分合并还没写。 任务:补全 dmax。make 编译后用 sample.txt 自测;check 会用随机数组(包括全是负数的)和随机区间
暴力双循环在做什么
第 1 步:i 在第 1 个:j 配了 4 次 第 2 步:i 在第 2 个:j 配了 3 次 第 3 步:i 在第 3 个:j 配了 2 次 第 4 步:两层循环:配对数随 n² 增长 13 15 17 23 24 i j 两层嵌套循环遍
为什么说它浪费
说暴力双循环「浪费」,是因为【0】。
什么样的双循环能优化
一个双循环能优化成 O(n),通常是因为【0】。