区间 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 编译。)
两个区间 DP 一起交
石子合并已给出,补全最长回文子序列,输出「石子合并的答案/bbbab 的回文长度」。两个的状态都是「区间 i 到 j」,差别只在转移里怎么拆。 (本题用 g++ -std=c++17 -O0 编译。)
网格路径的转移方程(C++)
只能往右或往下走,走到某一格的路径数等于【0】。
编辑距离的三种操作
第 1 步:第一行、第一列都只有一条路 第 2 步:第 2 行第 2 列:上加左 第 3 步:第 2 行第 3 列:上加左 第 4 步:第 2 行第 4 列:上加左 第 5 步:第 3 行第 2 列:上加左 第 6 步:第 3 行第 3 列
三行四列的网格有几条路
从左上角走到右下角,只能往右或往下。运行下面这段程序: #include <algorithm> #include <iostream> #include <string> #include <ve