zoukankan      html  css  js  c++  java
  • 【BZOJ 3294】[Cqoi2011]放棋子

    题解:

    一道很经典的组合数+dp

    首先考虑f[i][j][k]表示前k种颜色正好占据了i行j列

    转移的话就是枚举第k种颜色占据了几行几列 通过自身转移

    然后其在内部的相对顺序是不确定的所以要乘以组合数

    f[i][j][k]=f[x][y][k-1]*C(i,x)*C(j,y)*g[i-x][j-y][k] 其中g[i-x][j-y][k]表示第k种颜色正好占据这i-x,j-y的方案数

    接下来考虑如何计算g[i][j][k]

    我们会发现这个东西不好递推。。因为不知道当前占据了哪几行

    而且也不太好从自身dp,因为可能会有重复

    那么考虑一下容斥

    g[i][j][k]=C(i*j,a[k])-g[x][y][k]*C(i,x)*C(j,y)

    为什么这样是不重复的呢

    因为当x和y不同时,显然有格子的行or列数不一样

    当x和y相同时,由于布局不一样,也一定有行or列数不一样

    这就是定义状态为严格满足占据了i行j列的优势所在

  • 相关阅读:
    对象拷贝-深拷贝
    eclipse安装桌面快捷方式
    ajax 分页
    单例模式
    过滤器
    ajax参数详解
    json
    反射
    jdbc02
    jdbc --例子7
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8824210.html
Copyright © 2011-2022 走看看