整数拆分问题

第一种

给定n,求把n拆分成若干个不相等的数的方案数。
f[i][j] f [ i ] [ j ] 表示把j拆成i个数。
考虑要不要新添加一个数,并把之前的数全部加一。
f[i][j]=f[i1][ji]+f[i][ji] f [ i ] [ j ] = f [ i − 1 ] [ j − i ] + f [ i ] [ j − i ]
由于数不相等,数的个数不超过 n n
那么时空复杂度 O(nn) O ( n n )

第二种

我写的很简略,这里有pty的详细解释
给定n,求把n拆分成若干个数的方案数,可以相同。
我们要使用到广义五边形数。
五边形数(非广义)长这样。形如 k(3k1)2 k ∗ ( 3 k − 1 ) 2 (盗图)(逃
这里写图片描述
广义五边形数是 k(3k+1)2 k ∗ ( 3 k + 1 ) 2 , k(3k1)2 k ∗ ( 3 k − 1 ) 2
前几项是0,1,2,3,5,7,12,15,22
P(n) P ( n ) 为拆分方案数
五边形数定理: P(n)P(n1)P(n2)+P(n3)+P(n5)...=0 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)=k1(1)k+1[P(nk(3k+1)2)+P(nk(3k1)2)] P ( n ) = ∑ k ≥ 1 ( − 1 ) k + 1 [ P ( n − k ∗ ( 3 k + 1 ) 2 ) + P ( n − k ∗ ( 3 k − 1 ) 2 ) ]
注意到k的级别是 n n 的,那么时间复杂度也是 O(nn) O ( n n )

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值