第一步先写暴力搜索

补全 go_rec:go_rec(i, c) 表示「从第 i 件开始挑、还剩容量 c」能拿到的最大价值,每件试「不拿」和「拿」两条路。输出「答案/调用次数」。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

第二步把参数当成下标存

补全 go_memo:拿 (i, c) 当 memo 的下标(-1 表示没算过),进函数先查,算完先写。输出「答案/调用次数」。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

第三步把递归换成填表

既然状态就是 (i, c),那就可以不用递归了。补全一维填表版,输出容量 8 的最大价值。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

三种写法省了多少

暴力和填表已给出,补全记忆化。输出三样:暴力调用次数/记忆化调用次数/三个答案是否全相同(相同输出 结果一致,否则 结果不一致)。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

设计状态先问自己什么(C++)

给一个新问题设计 DP 状态,要先问【0】。

开始练习 →

交付一个进阶 DP 要验什么

第 1 步:五样 DP 一起验收 第 2 步:背包:和小规模暴力对拍 第 3 步:滚动:和小规模暴力对拍 第 4 步:区间:和小规模暴力对拍 第 5 步:网格:和小规模暴力对拍 第 6 步:状压:和小规模暴力对拍 第 7 步:全都对上,才算

开始练习 →

五项一起对得上吗

运行下面这段程序: #include <algorithm> #include <iostream> #include <string> #include <vector> using nam

开始练习 →

第一步两种背包

最终作品第一步:补全 0/1 背包和完全背包(同一批物品、容量 10),输出「0/1 的答案/完全的答案」。 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重 5 值 11),写成 vector<pair<int, i

开始练习 →

第二步压掉一维

二维版已给出,补全一维版,输出三样:一维答案/二维格子数/一维格子数。 本路线的物品:(重 3 值 8)、(重 4 值 9)、(重 5 值 11),写成 vector<pair<int, int>>,auto [w,

开始练习 →

第三步两个区间 DP

最长回文子序列已给出,补全石子合并(按区间长度从短到长填),输出「石子 4、1、2、3 的最小代价/bbbab 的回文长度」。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →