划分為 k 個正整數
設 \(f_{i,j}\) 為把 \(i\) 划分為 \(j\) 個數的方案數,得:
整體加 \(1\) 和新划分 \(1\)。
划分為不重復的 k 個正整數
設 \(f_{i,j}\) 為把 \(i\) 划分為 \(j\) 個數的方案數,得:
整體加 \(1\) 和整體加 \(1\) 后再新划分 \(1\)。
划分為不大於 m 的不重復的 k 個正整數
設 \(f_{i,j}\) 為把 \(i\) 划分為 \(j\) 個數的方案數,得:
整體加 \(1\) 和整體加 \(1\) 后再新划分 \(1\)。
當 \(i > m\) 時減去后面一項,因為每個數不重復,所以每次轉移最多有一個數大於 \(m\),變為 \(m+1\),需要減去其貢獻。
划分為 k 個奇數
設 \(f_{i,j}\) 為把 \(i\) 划分為 \(j\) 個奇數的方案數,\(g_{i,j}\) 為把 \(i\) 划分為 \(j\) 個偶數的方案數,得:
優化
上面的 \(DP\) 直接做復雜度都是 \(O(n^2)\) 的,無法接受,考慮優化。
划分為若干個正整數
分成兩塊\([1,S-1],[S,n]\)來計算,最后用乘法原理統計答案。
前一塊用直接用完全背包求解。
后一塊中被划分的數大於等於 \(S\),所以原先的 \(DP\) 中 \(j\) 只用枚舉到 \(\frac{n}{S}\),這里考慮到的最小的數也不再是 \(1\),而是 \(S\),於是方程變為:
復雜度為 \(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\) 是根號級別的。