第三步自己设计两个状态
补全打家劫舍和最大子段和,两个答案拼起来输出。 (本题用 g++ -std=c++17 -O0 编译。)
第四步把边界单独验
验三种边界:最大子段和遇上全负数 [-3, -1, -4]、爬楼梯 n = 0、打家劫舍空数组。三个结果用 / 拼起来输出。 (本题用 g++ -std=c++17 -O0 编译。)
交付状态转移加记忆化
这是这条路线的最终作品。六个函数都在,补全其中的记忆化 fib、填表 fib、打家劫舍、最大子段和,main 一次验完五条:朴素 fib(12) 调用 465 次、记忆化只要 23 次且结果相同;填表 fib(12) 也是 144;爬 10
对拍要拿谁当标准
写完一个 DP,想用随机数据检查它,最好拿【0】当标准答案。
在真机上写最大子段和
场景:实验机上 ~/work/dp/maxsub.cpp 读入 n 和 n 个整数,要输出最大的连续子段和(至少选一个数)。max_sub 还是空的。 任务:补全 max_sub。数可以是负数,绝对值到 10^9,n 到 10^5,和要用
fib 递归太慢了
场景:~/work/dp/fib.cpp 读入若干个 n(0 ≤ n ≤ 90),每个输出 fib(n)。它照定义递归,n 一到 45 左右就要跑很久。 任务:改写 fib.cpp,让每个 n 都能在 1 秒内算完。make 编译(-O2)
修好路径计数的溢出
场景:~/work/dp/grid.cpp 读入 m、n,输出从 m×n 网格左上角只往右、往下走到右下角的路径数。小网格对,大一点就出负数。 任务:修好 grid.cpp,m + n 到 60 也要算对。make 编译后用 sample.
修好无穷大的初始化
场景:~/work/dp/coins.cpp 读入硬币面值和目标金额,输出最少要几枚硬币,凑不出来输出 -1。可它不管给什么都输出 0。 任务:修好 coins.cpp 的初始化,并确认凑不出来时输出 -1。make 编译后用 sample
在真机上写打家劫舍
场景:~/work/dp/rob.cpp 读入 n 和每家的钱数,输出相邻两家不能都偷时最多能拿多少。rob 还是空的。 任务:补全 rob。n 到 10^5,每家钱数到 10^9,总和要用 long long;n 可能是 0。make 编
0/1 背包里的 0/1 指什么
「0/1 背包」这个名字里的 0 和 1,指的是【0】。