第一种
给定n,求把n拆分成若干个不相等的数的方案数。
设f[i][j]表示把j拆成i个数。
考虑要不要新添加一个数,并把之前的数全部加一。
f[i][j]=f[i−1][j−i]+f[i][j−i]
由于数不相等,数的个数不超过n−−√
那么时空复杂度O(nn−−√)
第二种
我写的很简略,这里有pty的详细解释
给定n,求把n拆分成若干个数的方案数,可以相同。
我们要使用到广义五边形数。
五边形数(非广义)长这样。形如k∗(3k−1)2(盗图)(逃

广义五边形数是k∗(3k+1)2,k∗(3k−1)2
前几项是0,1,2,3,5,7,12,15,22
设P(n)为拆分方案数
五边形数定理:P(n)−P(n−1)−P(n−2)+P(n−3)+P(n−5)...=0
其中P(0)=1,n小于0时P为0。
那么P的递推式是
P(n)=∑k≥1(−1)k+1[P(n−k∗(3k+1)2)+P(n−k∗(3k−1)2)]
注意到k的级别是n−−√的,那么时间复杂度也是O(nn−−√)