首页 > 其他分享 >珍珠项链

珍珠项链

时间:2024-02-16 11:55:24浏览次数:22  
标签:... 珍珠 矩阵 珠子 编号 长度 珍珠项链

这道题目看到\(N\)这么大,就不用想组合数学了,一般都是递推+矩阵快速幂

设\(f[i][j]\)表示用\(i\)种珍珠构成长度为\(j\)的项链的种数

由于矩阵快速幂要求向量长度不长但是变化时间很长,所以这里我们要把\(i\)作为向量长度,\(j\)作为变化时间,所以要考虑最后一个珠子是什么(这样递推的时候才只会用到\(j-1\)的数据)

有\(f[i][j]=\sum_{k=1}^{i} f[i-1][j-1]+f[i][j-1]=i(f[i-1][j-1]+f[i][j-1])\)

前面一项是考虑我最后一个珠子放编号为\(k\)的珠子而且这个珠子是第一次出现(注意由编号为\(1,2,3...k-1,k+1,k+2...i\)组成长度为\(j-1\)的珠子与由编号为\(1,2,3...i-1\)组成长度为\(j-1\)的珠子是等价的)

后面一项是我考虑最后一个珠子放编号为\(k\)的珠子而且这个珠子在前\(j-1\)个珠子中已经出现过了

现在还有一个问题,就是题目要求的是长度不超过\(N\)的项链,但是我们求得是刚好等于\(N\)的,怎么解决?

有两种解决方案,我先讲讲第一种,第二种放到老板的解决方法讲

第一种方法就是改状态:设\(f[i][j]\)表示用\(i\)种珍珠构成长度不超过\(j\)的项链的种数

这时只有\(f[1][j]=f[1][j-1]+1\)改变了一下,\(f[2+][j]\)之后的状态转移方程都不变

所以就可以写出一个转移矩阵:

注意这是\(k+1\)阶矩阵

然后上矩阵快速幂就好了

然后来看看老板的做法

我们的DP状态一般是不会考虑这个状态之外的全局的东西的,他这里考虑了:这里的\(j\)种珍珠指的是从所有的\(k\)种珍珠任选\(j\)种珍珠组成的方案数的总和

然后介绍第二种方法:在向量中添加一个元素表示前缀和

标签:...,珍珠,矩阵,珠子,编号,长度,珍珠项链
From: https://www.cnblogs.com/dingxingdi/p/18017014

相关文章