我们常常会对自然数进行分解,求取不同分解的组合数目或者对分解出的序列进行一系列操作。
各种分解方法中的k数出现次数:
4 = 1 + 1 + 1 + 1 4 = 1 + 1 + 2 4 = 1 + 2 + 1 4 = 2 + 1 + 1
4 = 1 + 3 4 = 2 + 2 4 = 3 + 1 4 = 4
f(n,k)代表对自然数n进行分解的各种分解方法中,数字k出现的次数。
我们可以看出,上述的分解方法是带有顺序的分解,即1、2、1和2、1、1是不同的分解方式。对于带顺序的分解方式,我们可以知道,当最左端或者最右端的数不同时,可代表不同的分解方式,故我们可以假定最右端的值不一样,当最右端值m定下之后,前面的总数n-m也就定了,而n-m是比n小的一个数,用动态规划的思想可直接使用结果。
4=(3)+1 4=(2)+2 4=(1)+3 4=(0)+4 ()中的数代表可分解,故我们可以得到状态转移方程:
f(n,k)=f(n-1,k)+f(n-2,k)+f(n-3,k)......+f(k,k)+F f(k,k)=1 由于右端值可以等于k,故这个k的贡献F等于(n-k)的分解个数为2^(n-k-1)
观察转移方程容易得出:f(k,k)=1 f(k+1,k)=1+2^0=2 ....... 相当于从k开始重新计算 ,故任意n.k都可以映射f(n,k)=f(n-k+1,1)
令g(n)=f(n,1), 有状态转移方程: //如果观察不出也没事,也可以按照下面方法处理
g(n)=g(n-1)+g(n-2)+...+g(1)+2^(n-2) 回推一步 g(n-1)=g(n-2)+g(n-3)+...+g(1)+2^(n-3) 两式做减法得新的状态转移方程
g(n)=2*g(n-1)+2^(n-3)
运用快速幂得到结果 g(3)=5,g(2)=2,g(1)=1; 其中g(n)中的n等于f(n,k)中的n-k+1;