bzoj3294[Cqoi2011]放棋子 dp+组合+容斥
3294: [Cqoi2011]放棋子
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 755 Solved: 294
[Submit][Status][Discuss]
Description
Input
输入第一行为两个整数n, m, c,即行数、列数和棋子的颜色数。第二行包含c个正整数,即每个颜色的棋子数。所有颜色的棋子总数保证不超过nm。
Output
输出仅一行,即方案总数除以 1,000,000,009的余数。
Sample Input
4 2 2
3 1
Sample Output
8
HINT
N,M<=30 C<=10 总棋子数有大于250的情况
很巧妙的dp,状态的定义很好
首先g[k][i][j]表示第k种颜色占据i行j列的方案
占据i行j列,放的棋子数在[max(i,j),i*j]之间
有i*j个格子,选择a[k]个放置,再减去没有完全占据i行j列的情况
然后f[k][i][j]表示前k种颜色占据i行j列
枚举每种颜色占据几行几列,从前一种颜色转移过来
最后统计ans的时候,考虑前p中颜色占据几行几列再乘上组合数
具体转移的看代码
推荐blog
http://blog.csdn.net/Regina8023/article/details/42584227
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define N 35
#define mod 1000000009
using namespace std;
int n,m,p,a[N],c[N*N][N*N];
ll g[N][N][N],f[N][N][N];
int main(){
#ifdef wsy
freopen("data.in","r",stdin);
#else
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
#endif
scanf("%d%d%d",&n,&m,&p);
for(int i=;i<=p;i++)scanf("%d",&a[i]);
for(int i=;i<=n*m;i++)c[i][i]=c[i][]=;
for(int i=;i<=n*m;i++)
for(int j=;j<i;j++)
c[i][j]=(c[i-][j-]+c[i-][j])%mod; for(int k=;k<=p;k++)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(i*j<a[k]||max(i,j)>a[k])continue;
g[k][i][j]=c[i*j][a[k]];
for(int x=;x<=i;x++)
for(int y=;y<=j;y++)
if((i-x)||(j-y))
g[k][i][j]=(mod+g[k][i][j]-g[k][x][y]*c[i][x]%mod*c[j][y]%mod)%mod;
} f[][][]=;
for(int k=;k<=p;k++)
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(i*j<a[k])continue;
for(int x=;x<i;x++)
for(int y=;y<j;y++)
f[k][i][j]=(f[k][i][j]+(f[k-][x][y]*g[k][i-x][j-y]%mod*c[i][x]%mod*c[j][y]%mod))%mod;
}
ll ans=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
ans=(ans+f[p][i][j]*c[n][i]%mod*c[m][j]%mod)%mod;
cout<<ans;
return ;
}
bzoj3294[Cqoi2011]放棋子 dp+组合+容斥的更多相关文章
- bzoj千题计划261:bzoj3294: [Cqoi2011]放棋子
http://www.lydsy.com/JudgeOnline/problem.php?id=3294 如果一个颜色的棋子放在了第i行第j列,那这种颜色就会占据第i行第j列,其他颜色不能往这儿放 设 ...
- BZOJ3294: [Cqoi2011]放棋子(计数Dp,组合数学)
题目链接 解题思路: 发现一个性质,如果考虑一个合法的方案可以将行和列都压到一起,也就是说,在占用行数和列数一定的情况下,行列互换是不会影响答案的,那么考虑使用如下方程: $f[i][j][k]$为占 ...
- bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1033 Solved: 480[Submit][Status][ ...
- [CQOI2011]放棋子--DP
题目描述: 输入格式 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm.N,M<=30 C<=10 ...
- BZOJ3294: [Cqoi2011]放棋子
Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm. Output 输出 ...
- BZOJ3294 CQOI2011放棋子(动态规划)
可以看做棋子放在某个位置后该种颜色就占领了那一行一列.行列间彼此没有区别. 于是可以设f[i][j][k]表示前k种棋子占领了i行j列的方案数.转移时枚举第k种棋子占领几行几列.注意行列间是有序的,要 ...
- BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)
题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...
- 【BZOJ3294】放棋子(动态规划,容斥,组合数学)
[BZOJ3294]放棋子(动态规划,容斥,组合数学) 题面 BZOJ 洛谷 题解 如果某一行某一列被某一种颜色给占了,那么在考虑其他行的时候可以直接把这些行和这些列给丢掉. 那么我们就可以写出一个\ ...
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...
随机推荐
- 清华集训2015 V
#164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...
- JAVA_SE基础——71.Random类制作随机验证码
public class Demo5 { public static void main(String[] args) { char[] arr={'s','b','g','h','a','c'}; ...
- Web Api 使用模型验证
public class Person { public int Id { get; set; } [Required(ErrorMessage = "姓名不能为空啊啊啊!")] ...
- Mybatis的mapper代理开发dao方法
看完了之前的mybatis原始的dao开发方法是不是觉得有点笨重,甚至说没有发挥mybatis 作为一个框架的优势.总结了一下,原始的dao方法有以下几点不足之处 dao接口实现方法中存在大量的模板方 ...
- 安装 go 语言环境
操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 安装go 这里直接安装二进制,其它方式请自行搜索. 1.下载并安装go 命令如下: ? 1 2 3 wget https://st ...
- hadoop2.6.0实践:A01 问题处理 DEPRECATED: Use of this script to execute hdfs command is deprecated.
[hadoop@hadoop-master data]$ hadoop dfs -ls /DEPRECATED: Use of this script to execute hdfs command ...
- 开源软件:NoSql数据库 - 图数据库 Cassandra
转载原文:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra简介 在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了 ...
- DevExpress 控件中GridControl的使用
近期开发用到了DevExpress系列的控件,GridControl是我用到的Dev系列控件最多的一个控件.现在先来总结一下: 首先先写一个简单的小例子来简单介绍一下GridControl的用法: 1 ...
- mysql 查询select语句汇总
数据准备: 创建表: create table students( id int unsigned primary key auto_increment not null, name varchar( ...
- ubuntu16.04下安装chrome
1.在终端中,输入以下命令: sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.l ...