[BZOJ]3294: [Cqoi2011]放棋子 DP+组合数学
2017-10-08 10:24
441 查看
Description
题解:
%了一下状态,勉勉强强推了个大概,但细节一堆错……f[i][j][k]表示前k种棋子占据i行j列的方案数,g[i][j]表示某一种棋子占据i行j列的方案数(一定要每行每列至少有一种棋子),先算g,再由g推出f。g[i][j]可以由总情况减去不合法情况得出,f[i][j][k]就枚举第k种棋子占据了哪些行,哪些列来转移。具体转移看代码。时间复杂度O(n2m2c)。代码:
#include<bits/stdc++.h> using namespace std; #define LL long long const int Maxn=32; const LL mod=1000000009; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*f; } int n,m,c,a[20]; LL f[Maxn][Maxn][20],g[Maxn][Maxn],C[Maxn*Maxn][Maxn*Maxn]; //前k种颜色棋子占据i行j列 某种颜色棋子占据i行j列 void pre() { C[0][0]=1; for(int i=1;i<=900;i++) { C[i][0]=1; for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod; } } int main() { pre(); n=read();m=read();c=read(); for(int i=1;i<=c;i++)a[i]=read(); f[0][0][0]=1; for(int k=1;k<=c;k++) { memset(g,0,sizeof(g)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(i*j>=a[k])//放得下第k种棋子 { g[i][j]=C[i*j][a[k]]; for(int p=1;p<=i;p++) for(int q=1;q<=j;q++) { if(i==p&&j==q)continue; g[i][j]=(g[i][j]-g[p][q]*C[i][p]%mod*C[j][q]%mod+mod)%mod; } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(i*j>=a[k]) { for(int p=1;p<=i;p++) for(int q=1;q<=j;q++) if(p*q>=a[k]) f[i][j][k]=(f[i][j][k]+f[i-p][j-q][k-1]*g[p][q]%mod*C[n-i+p][p]%mod*C[m-j+q][q]%mod)%mod; } } LL ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ans=(ans+f[i][j][c])%mod; printf("%lld",ans); }
相关文章推荐
- 【BZOJ3294】放棋子(CQOI2011)-DP+组合数学
- 【BZOJ3294】[Cqoi2011]放棋子【计数DP】
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
- BZOJ 3294: [Cqoi2011]放棋子
- BZOJ3294 CQOI2011放棋子(动态规划)
- bzoj 3294: [Cqoi2011]放棋子 动态规划+排列组合
- BZOJ 3294: [Cqoi2011]放棋子
- bzoj3294[Cqoi2011]放棋子 dp+组合+容斥
- BZOJ 3294: [Cqoi2011]放棋子
- 【组合计数】【bzoj 3294】: [Cqoi2011]放棋子
- [BZOJ3294][Cqoi2011]放棋子(DP+组合数学+容斥)
- bzoj3294: [Cqoi2011]放棋子 容斥原理
- bzoj千题计划261:bzoj3294: [Cqoi2011]放棋子
- BZOJ3294 [CQOI2011]放棋子
- bzoj 3294: [Cqoi2011]放棋子 (容斥原理+组合数+DP)
- 【BZOJ 3294】[Cqoi2011]放棋子
- 3294: [Cqoi2011]放棋子
- BZOJ P3294[Cqoi2011]放棋子
- 【bzoj 2668】: [cqoi2012]交换棋子
- BZOJ3295 [Cqoi2011]动态逆序对