memset 填对「无穷大」

用面值 2、3、7 凑出 12,求最少几枚,dp 数组先要填成「无穷大」。memset 是按字节填的,填 1000000000 只会取它的最低一个字节(0)。改成填 0x3f:每个 int 变成 0x3f3f3f3f,约 10.6 亿,足够

开始练习 →

编辑距离也能滚

编辑距离的第 i 行只依赖第 i-1 行,所以用两个一维数组 pre、cur 就够。补全每一行算完之后的那一步,输出「horse 变 ros 的步数/intention 变 execution 的步数」。 (本题用 g++ -std=c++

开始练习 →

方案数要用 long long

面值 1、2、5、10、20、50、100、200,凑出 10000 有几种组合?方案数远远超过 21 亿,dp 数组要选对类型。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

区间 DP 的状态是什么

第 1 步:长度 1:自己一堆,代价 0 第 2 步:再填长度 2 的区间 第 3 步:再填长度 3 的区间 第 4 步:再填长度 4 的区间 第 5 步:右上角就是整段的答案 j=0 j=1 j=2 j=3 i=0 i=1 i=2 i=3

开始练习 →

区间 DP 的填表顺序

区间 DP 必须【0】地填表。

开始练习 →

把四堆石子合成一堆

四堆石子 4、1、2、3,每次只能合并相邻两堆,代价是这两堆之和。求把它们合成一堆的最小总代价。运行下面这段程序: #include <algorithm> #include <iostream> #include

开始练习 →

最长回文子序列

从字符串里挑出若干字符(可以不连续,但顺序不变),要它正着读反着读一样,最长能有多长?两个例子:bbbab 和 cbbd。运行下面这段程序: #include <algorithm> #include <iostream&

开始练习 →

写石子合并

补全 merge_cost:按区间长度从 2 到 n 外层循环,区间里枚举断点 k。pre 是前缀和,用来 O(1) 取区间和。输出石子 4、1、2、3 的最小代价。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

写最长回文子序列

补全 lps:两端字符相同就 dp[i+1][j-1] + 2,不同就取 dp[i+1][j] 和 dp[i][j-1] 里大的。输出 bbbab 的答案。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

填表顺序写错会怎样

merge_cost 按区间长度填(已给出),补全 merge_bad:外层是左端点 i 从小到大,内层 j 从 i+1 往右。输出「对的结果/错的结果」。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →