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]}})

    两者相加

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

    搞个矩阵快速幂就好了

    代码

  • 相关阅读:
    Restful API
    Vue之指令
    Scrapy框架
    爬虫提高性能:串行、线程进程、异步非阻塞
    MongoDB
    Beautifulsoup模块
    请求库之selenium
    php 正则匹配中文
    Javascript的"预编译"思考
    PHP程序员面试技巧之口试题分享
  • 原文地址:https://www.cnblogs.com/lstoi/p/9818467.html
Copyright © 2011-2022 走看看