整数划分
划分为 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\),需要减去其贡献。
划分为 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\) 是根号级别的。