dp/lib.rs
1//! 動的計画法。
2//!
3//! ## Notations
4//!
5//! $`\Lambda_n = \{0, 1, \dots, n-1\}`$ とする。
6//!
7//! ## Idea
8//!
9//! ### Variants
10//!
11//! #### 区間での分割全体からなる集合
12//!
13//! 長さ $`n`$ の配列をいくつかの非空な区間に分割したものを考える。
14//! すなわち、$`[0\lldot n) = [i_0\lldot i_1)\sqcup[i_1\lldot i_2)\sqcup\dots\sqcup[i_{k-1}\lldot i_k)`$
15//! とする。ただし、$`(i_0, i_k) = (0, n)`$ である。
16//! この分割全体からなる集合 $`\dp[n]`$ を考えたい。
17//!
18//! $`\dp[0] = \{\emptyset\}`$ である。$`i\ge 1`$ に対して下記が成り立つ。
19//! ```math
20//! \dp[n] = \{\{[0\lldot n)\}\}\sqcup\bigsqcup_{i\in\Lambda_n} \{S\sqcup\{[n-1\lldot n)\} \mid S\in\dp[n-1]\}.
21//! ```
22//!
23//! 分割 $`[l\lldot r)`$ に関する値 $`f(l, r)`$ に対し、$`f(i_0, i_1)\circ\dots\circ f(i_{k-1}, i_k)`$
24//! のすべての分割における $`\ast`$-fold を求めるのに使える場合がある ([ABC 224 F])。
25//!
26//! [ABC 224 F]: https://atcoder.jp/contests/abc224/tasks/abc224_f
27//!
28//!
29//! ## See also
30//!
31//! - <https://rsk0315.hatenablog.com/entry/2023/09/10/225138>