正整数拆分问题
来源:互联网 发布:互联网产品经理 知乎 编辑:程序博客网 时间:2024/06/13 23:36
Problem 1
求将正整数N无序拆分成若干个不大于M的正整数的方案数
设
考虑第
是为前者,否为后者
显然可以将空间优化成一维
时间复杂度为
Problem 2
求将正整数N无序拆分成M个正整数的方案数
有序拆分即为组合问题,此略
Algorithm 1
由于其无序性,我们默认枚举拆分的正整数由小到大
设
枚举下一个数
这样dp(由当前状态枚举更新未来状态)俗称刷表,刷表的好处是若当前状态不合法,此次无需花费转移的复杂度
但是算一下,总复杂度为
Algorithm 2
考虑优化上述dp
我们换一种dp方式,枚举已有状态来更新当前状态,转移式为
显然
那么总复杂度优化为
但是时间复杂度仍然不够优
Algorithm 3
我们多花费了一维状态来限制无序的条件,事实上可以换一种思路
设
在已选数集中增加一个1,方案数为
将已选数集中每个数加1,方案数为
我们甚至可以把空间优化成一维的
时间复杂度
Algorithm 4
233其实Problem 2可以转化为Problem 1
如图,将数的大小形象成高度,从左到右依次是M个正整数
其中高度总和为N
首先每个数非零,于是将最底层用M的代价填满,总和还剩N-M
从下往上看,剩下每一行的数的个数单调递减
那么每一行相当于一个拆分,问题变为将N-M拆分成若干个不小于M的正整数
可以套用Problem 1的DP
- 正整数拆分问题
- 正整数n的k拆分问题
- 正整数拆分
- UVA-10590 正整数拆分
- 拆分为连续正整数之和
- 实现将一个正整数随机拆分为三个正整数-- 【叶子】
- 实现将一个正整数随机拆分为三个正整数
- HDOJ1028(正整数拆分-普通型母函数模板)
- 【基本算法】拆分为连续正整数之和
- 正整数分解问题.
- 连续正整数问题
- 高精度正整数乘法问题
- 问题 : 正整数分组
- 把输入整数拆分为连续的正整数之和
- 拆分正整数组,使二者和最接近,且长度无限制
- 拆分正整数数组,使二者和最接近,且长度相等。
- poj 1032 Parliament(正整数拆分不同数使乘积最大)
- C语言 输入一个正整数 拆分个位数 相加
- 常见算法面试链表
- Java启动参数与内存调优一些学习笔记
- TypeScript 学习笔记7: Generics
- 进程和线程
- js中的正则表达式的用法
- 正整数拆分问题
- C#WinForm制作异形窗体/控件
- 20170703滞涨股票
- doT.js调用接口数据
- 汽配行业经典ERP客户案例
- UE4人物骨骼动画播放
- JVM的内存区域划分以及垃圾回收机制详解
- ORACLE学习笔记一
- 响应式开发细节