zoukankan      html  css  js  c++  java
  • 正睿19暑期B班DAY6 DP

    毛姐姐的ppt做的真好看///

    动态规划

    由于ppt里真的很详细了,建议看ppt理解

    这里做一些小批注


    • You are given a tree

      link

    证明:f中不同的取值个数是(sqrt{n})级别的

    (k leq sqrt{n})时 必然只有不多于(sqrt{n})种取值

    (k geq sqrt{n})(ans leq n / k, n / k leq sqrt{n}) 所以也不多于(sqrt{n})种取值

    小套路:对于单调的答案 边界上二分

    (O(n sqrt{n} log n))


    • Vladislav and a Great Legend

      link

    (x^k = sum_{i = 0}^{x} binom{x}{i} i! S(k, i))

    (S(k, i))是第二类斯特林数

    表示将k个不同元素拆分成i个集合(k个不同的球放进i个相同的筐)的方案数

    S[0][0] = 1;
    for(int i = 1; i <= k; ++i)
        for(int j = 1; j <= i; ++j){
            S[i][j] = (S[i - 1][j - 1] + (ll)(S[i - 1][j] * j % P) % P);
        }
    

    关于这个式子的解释。。

    (x^k)可以看作k个不同的筐里 每个筐放1~x个相同的小球

    右边(sum_{i = 1}^{x})是枚举有多少个本质不同的筐(本质不同就是里面放的小球数不同

    我们让筐拥有姓名 就乘上( binom{x}{i}),表示选择这i个本质不同的筐各有多少个小球,但球数相同的筐仍然是一样的,而且我们并不知道每种球数的筐有几个

    (i!S(k, i))是k个姓名,被放进i个集合,并把集合排序分发给筐,于是筐和球过上了幸福的生活

    用这个也可以导出斯特林数通项公式


    (ans = sum_{x}sum_{i = 0}^{k} binom{f(X)}{i}i!S(k, i))

    (sum_{i = 0}^{k} i!S(k, i) sum_{x} binom{f(X)}{i})

    背包size和k取一个min 可以分析出这样的背包复杂度为(O(nk))


    • Uniformly Branched Trees

      link

    有t棵子树大小等于k

    (f[i][j][k] = f[i - t * k][j - t][k - 1] binom{f[k][d - 1][k - 1] + t - 1}{t})

    解释一下这个式子

    (f[i][j][k])表示节点数为i,共有j棵⼦树,有t棵子树的大小等于k

    (f[i - t * k][j - t][k - 1])很显然啦

    (f[k][d - 1][k - 1])是因为要求中间节点度数为d 而且它每棵子树多大并不限制

    确定了前d - 1个子树之后 为了保证总点数为k 最后一棵子树的点数也确定了

    ( binom{f[k][d - 1][k - 1] + t - 1}{t})表示在X种⽅案中不分顺序地选取t种,可重复的⽅案数

    最后的答案

    (ans = f[n][d][frac{n}{2}] - binom{f[frac{n}{2}][d - 1][frac{n}{2} - 1] + 1}{2})

    注意右上角的加一是因为左右两部分可以相同形态,所以需要增加一个选项

    (O(n^2d^2))

    • Multiplicity

      link

    • Maximum Element

      link

    递推式分析

    (f[i] = sum f[j - 1] binom{i - 1}{i - j} (i - j)!)

    枚举最大值出现在j的位置 满足前j-1个数允许最大值出现

    ( binom{i - 1}{i - j} (i - j)!)表示第j位(即最大值)之后填充的是哪几个数字以及它们的排列

    子序列做法:(f[i](0 leq i leq 3))表示现在最多有i个字母的最小代价

    若s[i]为第j个字母 那么(f[j] = min(f[j - 1], f[j] + a[i]))

    子串做法:单词内贪心一下,每个hard取四个字母中最小代价作为代价

    • Kuro and Topological Parity

    link

    其实并不用在状态里记录数量

    • Hero Meet Devil

    感觉所谓dp套dp

    就是把一些影响统计并且随着转移改变的量写进状态里

    • XHXJ’s LIS

    与上一题很类似 因为LCS非常短 用状态压缩模拟一般的求LCS过程

  • 相关阅读:
    Git的使用
    Flask(五)
    Flask(四)
    Flask(二)
    Flask(一)
    SDL 五子棋游戏
    c++单例模式
    ubuntu安装虚拟机
    git 命令
    汇编x86入门
  • 原文地址:https://www.cnblogs.com/hjmmm/p/11291120.html
Copyright © 2011-2022 走看看