整数划分

1|0划分为 k 个正整数

fi,j 为把 i 划分为 j 个数的方案数,得:

fi,j=fij,j+fi1,j1

整体加 1 和新划分 1

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

fi,j 为把 i 划分为 j 个数的方案数,得:

fi,j=fij,j+fij,j1

整体加 1 和整体加 1 后再新划分 1

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

fi,j 为把 i 划分为 j 个数的方案数,得:

fi,j=fij,j+fij,j1fi(m+1),j1

整体加 1 和整体加 1 后再新划分 1

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

[HEOI2014]平衡

4|0划分为 k 个奇数

fi,j 为把 i 划分为 j 个奇数的方案数,gi,j 为把 i 划分为 j 个偶数的方案数,得:

fi,j=gij,j+fi1,j1gi,j=fij,j

5|0优化

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

1|0划分为若干个正整数

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

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

后一块中被划分的数大于等于 S,所以原先的 DPj 只用枚举到 nS,这里考虑到的最小的数也不再是 1,而是 S,于是方程变为:

fi,j=fij,j+fiS,j1

复杂度为 O(n(S+nS))S=n 时最优,复杂度为 O(nn)

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

j 个数的最小值为 k=1jk=j(j+1)2i,得 j 是根号级别的。

五边形数


__EOF__

本文作者lhm_
本文链接https://www.cnblogs.com/lhm-/p/13499402.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
posted @   lhm_liu  阅读(786)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示