一、某动规题目
题意:
一共有n个物品,选定每个物品有得分,并且有m个关系使得选取给定的两种物品有额外得分,选取k个物品使得得分最大。(这m个关系是一个森林)
n<=2000,m<=2000,k<=n
初步解析:
如果我们直接设f[i][j]表示前i个物品里选j个并且选取了i的最大得分。
我们发现有一种情况无法更新。
即如果第i个物品与第i-2个物品有额外得分的话,那么我们只能在选取第i-2个物品时来加上这个额外得分。
但是在第i-1个物品的状态里,可能选取了第i-2个物品,也可能没有选取第i-2个物品,这个时候我们无法记录是否应该加上这个额外得分,并且这种更新是不成立的,因为你当前选取某物品之后是对未来的决策具有影响的。
正确解法
我们注意到上面的解法里并没有用到题里的给定条件,即每个物品至多与两个物品有绑定关系。
显然可以发现这种绑定关系是一条链。
所以我们可以把所有的物品重新排序。
即按照链的顺序排列所有的物品。
(不妨把关系(i,j)看做物品i到物品j的一条边,
i<j
)
这样的话对于某物品i,如果有一个物品连向他,那么连向他的这个物品的新编号一定是i-1。
这样的话,继续套用上述DP方程,f[i][j]表示前i个点选取j个并且选i的最大得分。
那么显然
这样的话就完美避免了上述我们无法确定先前的状态是否选取了连向该点的点的情况。
二、某概率证明
题意:
某事件发生每次概率为p,求发生该事件的期望次数。
解析:
根据数学期望公式:
设:
则:
1式减2式有:
∵
∴
∴
∴
三、某脑洞
题意:
求 Ckn+C2∗kn+C3∗kn+C4∗kn+...+C⌊nk⌋∗kn 对P取模的值。
第一阶段:
n<=5000,k<=50,p<=1000000007
直接预处理组合数无脑枚举。
第二阶段:
n<=1000000,k<=50,p<=1000000007
O(n^2)的预处理并不可取。
可以发现这个问题可以递推。
不妨设
F[i][j]=C[i][j]+C[i][j+k]+C[i][j+2∗k]....
因为我们知道组合数的递推公式
C[i][j]=C[i−1][j−1]+C[i−1][j]
所以可以得出
F[i][j]=(C[i−1][j]+C[i−1][(j−1)
%
k]+C[i−1][j+k]+C[i−1][(j−1)
%
k+k]+....)mod
p
显然直接递推可以O(n*k)复杂度出解。
答案即
第三阶段:
n<=1000000000,k<=50,p<=1000000007
我们显然可以构造出一个转移矩阵来加速这一递推过程。
复杂度
O(logn∗k3)
以下为口胡
第四阶段:
n<=1000000000,k<=1000,p<=1000000007
由第三阶段我们可以得知该转移矩阵的形式为一个循环矩阵。
所以在矩乘中我们可以少枚举一个行,从而降下
O(k)
的复杂度。
复杂度
O(logn∗k2)
第五阶段:
n<=1000000000,k<=1000000,p<=1000000007
既然都说是循环矩阵了,所以在矩乘的时候显然就是多项式乘法的形式。
FFT!FFT!
复杂度
O(logn∗k∗logk)