zoukankan      html  css  js  c++  java
  • 整数划分

    划分为 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 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) 是根号级别的。

    五边形数

  • 相关阅读:
    Viewpager的用法
    Android上下文菜单
    Android开机自启动程序
    微信小程序踩过的坑
    Sublime Text 配置python文件
    Pandas速查手册中文版
    scrapy架构设计分析
    爬虫服务集群处理nginx返回504
    phantomjs 无法打开https网站
    Selenium判断获取的元素是否可见(display:none)
  • 原文地址:https://www.cnblogs.com/lhm-/p/13499402.html
Copyright © 2011-2022 走看看