在真机上写最大子段和

场景:实验机上 ~/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】。

开始练习 →

二维 dp[i][c] 表示什么

第 1 步:容量 0~6,一开始全是 0 第 2 步:第 1 件:从 6 倒着填到 2 第 3 步:第 2 件:从 6 倒着填到 3 第 4 步:每件只被算进一次 0 0 0 0 0 0 0 0 0 3 3 3 3 3 c 0 0 3 4

开始练习 →

一维写法为什么必须倒着填

第 1 步:容量 0~6,一开始全是 0 第 2 步:第 1 件:从 6 倒着填到 2 第 3 步:第 2 件:从 6 倒着填到 3 第 4 步:每件只被算进一次 0 0 0 0 0 0 0 0 0 3 3 3 3 3 c 0 0 3 4

开始练习 →

一维表最后长什么样

三件物品 (重3值8)、(重4值9)、(重5值11),容量 10,每件最多拿一次。运行下面这段程序,看整张一维表: #include <algorithm> #include <iostream> #include

开始练习 →

那个 40 是怎么填出来的

回到「贪心」那条路线里的三件东西:(重6值30)、(重5值20)、(重5值20),容量 10。当时只说了最优解是 40,现在把它填出来: #include <algorithm> #include <iostream>

开始练习 →