整数划分

划分为 k 个正整数

\(f_{i,j}\) 为把 \(i\) 划分为 \(j\) 个数的方案数,得:

\[\large f_{i,j}=f_{i-j,j} + f_{i-1,j-1} \]

整体加 \(1\) 和新划分 \(1\)

划分为不重复的 k 个正整数

\(f_{i,j}\) 为把 \(i\) 划分为 \(j\) 个数的方案数,得:

\[\large f_{i,j}=f_{i-j,j} + f_{i-j,j-1} \]

整体加 \(1\) 和整体加 \(1\) 后再新划分 \(1\)

划分为不大于 m 的不重复的 k 个正整数

\(f_{i,j}\) 为把 \(i\) 划分为 \(j\) 个数的方案数,得:

\[\large f_{i,j}=f_{i-j,j} + f_{i-j,j-1} - f_{i-(m+1),j-1} \]

整体加 \(1\) 和整体加 \(1\) 后再新划分 \(1\)

\(i > m\) 时减去后面一项,因为每个数不重复,所以每次转移最多有一个数大于 \(m\),变为 \(m+1\),需要减去其贡献。

[HEOI2014]平衡

划分为 k 个奇数

\(f_{i,j}\) 为把 \(i\) 划分为 \(j\) 个奇数的方案数,\(g_{i,j}\) 为把 \(i\) 划分为 \(j\) 个偶数的方案数,得:

\[\large \begin{aligned} f_{i,j}&=g_{i-j,j}+f_{i-1,j-1} \\ g_{i,j}&=f_{i-j,j} \end{aligned} \]

优化

上面的 \(DP\) 直接做复杂度都是 \(O(n^2)\) 的,无法接受,考虑优化。

划分为若干个正整数

分成两块\([1,S-1],[S,n]\)来计算,最后用乘法原理统计答案。

前一块用直接用完全背包求解。

后一块中被划分的数大于等于 \(S\),所以原先的 \(DP\)\(j\) 只用枚举到 \(\frac{n}{S}\),这里考虑到的最小的数也不再是 \(1\),而是 \(S\),于是方程变为:

\[\large f_{i,j}=f_{i-j,j} + f_{i-S,j-1} \]

复杂度为 \(O(n(S+\frac{n}{S}))\)\(S=\sqrt n\) 时最优,复杂度为 \(O(n\sqrt n)\)

划分为不重复的若干个正整数

\(j\) 个数的最小值为 \(\sum\limits_{k=1}^j k = \frac{j(j+1)}{2} \leqslant i\),得 \(j\) 是根号级别的。

五边形数

posted @ 2020-08-13 22:43  lhm_liu  阅读(770)  评论(0编辑  收藏  举报