zoukankan      html  css  js  c++  java
  • jdr挖的大坑

    计数问题小结

    很多计数问题在直接拆分计算贡献时都会出现不容易直接表示的情况。
    在解决这些问题时,往往需要解决一些子问题方案数的递推,

    再套用组合数或者分块计算来降低难度或时间复杂度,这里给出几种递推方法。

    辅助数组篇:

    1.数的拆分

    对于整数的拆分如$3=3=1+2=1+1+1$可以$O(n^2)$跑 完全背包

    然而这样只在无任何限制条件下才能的通的方法。

    对于一个整数$m$,可以将其拆分数分解为对于每个拆分数个数的累和,所以有:

    设$Large f_{(i,j)}$表示用$i$个数来凑成j的方案数,其中,要求最小的数不能小于k。

    递推式

    $Large f_{(i,j)}=f_{(i-1,j-k)}+f_{(i,j-k)}$

    2.染色计数

    一共i种颜色涂j个格子,答案为$Large j!g_{i,j}$

    其中:$Large g_{i,j}=g_{i-1,j-1}+j*g_{i-1,j}$

    若相邻不能相同,那么$Large g_{i,j}=g_{i-1,j-1}+(j-1)*g_{i-1,j}$

    若每次调用$g_{i,j}$时$j$都不变,那么可以将原式降维为$f_{i}$表示长为n的序列染成i种颜色。

    则:$Large f_i=i^n-sumlimits_{j=1}^{i-1}C_{i}^{j}{f_{j}}$(任选-只选1个-只选2个...)

    3.排列计数

    考虑前i个数的排列,加入i+1之前的情况和加入之后的状况,这样可以在递推的过程中考虑维护数列内部的结构,

    其放置方法就是在i+1个空中插入,利用空的个数来转移。在破坏结构时在另一维同时进行计数,以待之后更安全的数来补全结构。

    最后对某种结构的数列进行计数。

    例如:统计一个1~n的排列,要求其中相邻的数差不为一。

    考虑i+1加入数列时只能在与i相邻时破坏其结构。

    那么就维护一个状态$f[i][j][0/1]$表示前i个数的排列有j个不合法位置和i与i-1相邻/不相邻

    $f[i][j][0]$就能够转移到$f[i+1][j+1][1]$,$f[i+1][j][0]$,$f[i+1][j-1][0]$,系数分别为2,i-j-1,j

    $f[i][j][1]$就能转移到$f[i+1][j+1][1]$,$f[i+1][j][1]$,$f[i+1][j-1][0]$,$f[i+1][j+1][0]$系数分别为:1,1,j-1,i-j

  • 相关阅读:
    ubuntu13.04 安装java
    PHP shell模式下执行PHP文件报错
    python urllib2 cookie 设置
    新浪微博模拟登录(Python+RSA加密算法)附源代码(转)
    Python 实现腾讯微博模拟登录 (附源码)
    python中的字符串与16进制的转换
    mysql in和exists性能比较和使用
    linux分析dump vmcore文件
    SecureCRT密钥key远连接程ssh证书登录Linux
    /tmp清理机制
  • 原文地址:https://www.cnblogs.com/blog-Dr-J/p/count.html
Copyright © 2011-2022 走看看