第一步先写暴力搜索
补全 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 编译。)