zoukankan      html  css  js  c++  java
  • 【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]}})

    两者相加

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

    搞个矩阵快速幂就好了

    代码

  • 相关阅读:
    python-TCP传输模型
    python-锁机制
    python-生产者消费者模式
    python-Lock锁线程同步和互斥
    python-Event事件线程同步和互斥
    python-thread封装类创建线程
    python-fifo管道文件通信
    python-thread多线程
    Sublime一些设置
    gdb的user-define command
  • 原文地址:https://www.cnblogs.com/lstoi/p/9818467.html
Copyright © 2011-2022 走看看