我们对知识的探究来源于探寻规律,而许多规律性的问题可以分出阶段进行递推解决,这样就形成了 DP。DP 非常有用,但它并不能取代找规律的过程。即使是多阶段决策问题,发现一些规律可能比直接使用 DP 更加简单。
例子:
你有 \(n\) 个字母 A,\(m\) 个字母 B,你可以将这些字母组成成为一个字符串, 你需要使得这个字符串的权值尽量大。现在我们以如下规则计算这个字符串的权值。
每有连续的 \(a\) 个 A ,且下一个字母依旧是 A,则权值 \(+1\)。假设 \(a = 3\),且连续有 \(7\) 个 A,那么根据此规则, 权值 \(+2\)。你可以理解一段长度为 \(cntA\) 的 A 所获得的权值为 \(\lfloor\dfrac{cntA-1}{a}\rfloor\)。
每有连续的 \(b\) 个 B ,且下一个字母依旧是 B,则权值 \(+1\)。
上一个字母和当前字母不一样时,权值 \(+1\)。(第一个字母前面没有字母,也
会使得权值 \(+1\))
假设当前字母是 B,则至少需要有连续 \(c\) 个字母 B,下一个字母才可以切换成
A。字母 A 切换到字母 B 没有任何限制。
请问你能构造的字符串权值最大可能是多少?
【数据范围】
对于 \(100\%\) 的数据,有 \(1 \le t \le 50,1 \le n, m, a, b, c \le 10^5\)
这道题乍一看像 DP,可以设状态 \(f_{i, j, k}\) 代表前 \(i\) 个字符用了 \(j\) 个 A 且以 \(b\) 结束的最大权值。
但是这种算法是 \(O(n^2)\) 的。
尝试优化它,手模一组小数据,发现 DP 决策极为规律,其根本原因是这道题的决策和当前所在位置并无关系,而只和前面的字符有关。这样 DP 就不是很有效率,因为循环相似的部分 DP 却要重新计算。更好的方式是手动找出规律,然后按照规律直接做结论即可。
这类不同阶段相似度很高的题不适合使用 DP 解决。