【20181019T2】硬币【矩阵快速幂优化DP】

题面

【错解】

(N leq 50)?双向搜索?

切了切……

等下,好像要求方案数……

好像搜不了

哎他给(V_{i} | V_{i+1})干嘛?

肯定有用啊

为了体现条件的用处,我在搜下一步时把后面的和S除以当前值

但还是T了啊

写了个(O(NW^{2}))的完全背包水水,瞎搞了个神奇算法,揉在一起,成功爆零

【正解】

(f_{t,i,j})表示选的硬币编号最大为i,最小大于等于j的凑出t的方案数

这样可以完整地表示出(f_{t,i,j}=sum f_{t_{1},i,k} imes f_{t_{2},k,j})(其中(t_{1}+t_{2}=t,j leq k leq i)

哎怎么那么眼熟?

这不就是传说中的……矩阵乘法?

换一下:

设矩阵(A_{t})的i行j列表示最大为i,最小大于等于j的凑出t的方案数

那么有(A_{v_{1}+v_{2}}=A_{v_{1}} imes A_{v_{2}})

首先预处理凑出每种硬币对应价值有多少种方案

①自己动手,丰衣足食

(A_{i})的最大为i,j不超过i(废话)的方案数为1

②从前面凑出来

(A_{i}=A_{i-1} ^{frac{v[i]}{v[i-1]}})

两者相加

然后从大往小跑,每次尽量取完,因为已经包含更小的情况,所以没有遗漏

搞个矩阵快速幂就好了

代码

原文地址:https://www.cnblogs.com/lstoi/p/9818467.html