划分为 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
egin{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)) 的,无法接受,考虑优化。
划分为 k 个正整数
分成两块([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(nsqrt n))。
划分为不重复的 k 个正整数
(j) 个数的最小值为 (sumlimits_{k=1}^j k = frac{j(j+1)}{2} leqslant i),得 (j) 是根号级别的。