zoukankan      html  css  js  c++  java
  • 【洛谷3158】[CQOI2011] 放棋子(DP水题)

    点此看题面

    • 给定一个(n imes m)的棋盘和(c)种颜色的棋子,第(i)种颜色有(a_i)个。
    • 求有多少种放完所有棋子的方式,使得每行每列都不存在异色棋子。
    • (n,mle30,cle10,sum a_ile250)

    颜色占领行列

    (g_{i,x,y})表示用第(i)种颜色的棋子占领(x)(y)列的方案数,即要把这(a_i)个棋子摆在一个(x imes y)的棋盘上,使得每行每列都至少有一个棋子。

    总方案数是(C_{x imes y}^{a_i}),不合法方案数就是(sum C_x^pC_y^qg_{i,p,q})(即枚举实际上占领了多少行多少列),二者相减即可。

    然后设(f_{i,x,y})表示前(i)种颜色共占领(x)(y)列的方案数。

    枚举第(i)种颜色占领了(p)(q)列转移,令(f_{i,x+p,y+q} exttt{+=}f_{i,x,y} imes C_{n-x}^p imes C_{n-y}^q imes g_{i,p,q})(原本的方案数×选择行列的方案数×第(i)种颜色的占领方案数)。

    代码:(O(n^4c))

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 30
    #define K 10
    #define X 1000000009
    using namespace std;
    int n,m,k,a[K+5],C[N*N+5][N*N+5],f[K+5][N+5][N+5],g[K+5][N+5][N+5];
    int main()
    {
    	RI i,j,x,y,p,q,F;for(scanf("%d%d%d",&n,&m,&k),i=1;i<=k;++i) scanf("%d",a+i);
    	for(C[0][0]=i=1;i<=n*m;++i) for(C[i][0]=j=1;j<=i;++j) C[i][j]=(C[i-1][j-1]+C[i-1][j])%X;//预处理组合数
    	for(i=1;i<=k;++i) for(x=1;x<=n;++x) for(y=1;y<=m;++y) if(a[i]<=x*y) for(g[i][x][y]=C[x*y][a[i]],//总方案数
    		p=1;p<=x;++p) for(q=1;q<=y;++q) (p^x||q^y)&&(g[i][x][y]=(g[i][x][y]-1LL*C[x][p]*C[y][q]%X*g[i][p][q]+X)%X);//减去非法方案数
    	for(f[0][0][0]=i=1;i<=k;++i) for(x=0;x<=n;++x) for(y=0;y<=m;++y) if(F=f[i-1][x][y])//DP转移
    		for(p=1;p<=n-x;++p) for(q=1;q<=m-y;++q) f[i][x+p][y+q]=(f[i][x+p][y+q]+1LL*F*C[n-x][p]%X*C[m-y][q]%X*g[i][p][q])%X;//枚举当前颜色占领行列数
    	RI s=0;for(i=k;i<=n;++i) for(j=k;j<=m;++j) s=(s+f[k][i][j])%X;return printf("%d
    ",s),0;//统计答案
    }
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    Opencv在mac系统的安装与试用
    VINS 估计器之检查视差
    C语言——第零次作业
    C语言博客05指针
    循环结构
    C语言博客作业数组
    函数3
    C博客作业01分支、顺序结构
    group by的查询
    layui多张图片上传最多9张(新增和修改时的显示问题)
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu3158.html
Copyright © 2011-2022 走看看