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个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...
随机推荐
- xcode修改代码目录结构出现clang:error:nosuchfileordirectory解决方法
需要迁移一个开源工程的一部分内容到自己工程,迁移对方的工程到自己工程之后,因目录结构配置整理需要,对嵌入的工程目录进行了结构改变,编译后出现: clang: error: no such file o ...
- tableView//collectionView加载时的动画
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:( ...
- 使用Putty连接Amazon EC2 Instance
Amazon的EC2中,默认是不允许使用用户名和密码直接连接Instance的,而是通过AWS (Amazon Web Service)提供的证书.在第一次使用EC2的时候,AWS会要求你创建一个证书 ...
- sql 多条记录插入
--多条记录插入,用逗号分开值. INSERT dbo.studentinfor ( id, name, class, age, hpsw ) ', -- id - nvarchar(50) N'te ...
- Python——cmd调用(os.system阻塞处理)
os.system(返回值为0,1,2) 0:成功 1:失败 2:错误 os.system默认阻塞当前程序执行,在cmd命令前加入start可不阻塞当前程序执行. 例如: import os os.s ...
- 到底什么是 "method group"
class Program { delegate void NoParam(); delegate void WithOneParam(string name); static void Main(s ...
- NoSQL&MongoDB
MongoDB: Is NoSQL(技术的实现,并非是一个特定的技术,与RMDS对立):Not only SQL 大数据问题:BigData,eg:同时访问几个页面,代码实现几个页面访问量的大小? F ...
- Spring Security入门(3-7)Spring Security处理页面的ajax请求
- 复习HTML+CSS(2)
n 项目符号嵌套编号思路 标签的内容(文本.项目符号.表格.图片等)必须放在最底层标记中. n 图片标记(行内元素,单边标记) l 语法:<img 属性 = "值"&g ...
- 使用LINGO来解决0/1背包算法问题
1.问题说明 0/1背包问题:我们有n种物品,物品j的重量为wj,价格为pj.我们假定所有物品的重量和价格都是非负的.背包所能承受的最大重量为W.如果限定每种物品只能选择0个或1个,则问题称为0-1背 ...