BZOJ 3294: [Cqoi2011]放棋子
2015-05-15 21:39
288 查看
题意:
![](http://www.lydsy.com/JudgeOnline/upload/201309/ff.jpg)
这个题还有很有技巧的,我们用动态规划来解决(其实我很长时间都在想网络流…)令g[k][i][j]表示只用第K种颜色完全占据I行J列,f[k][i][j]表示用前K种颜色完全占据I行J列(状态的设定很巧妙啊)
容易得到:f[k][i][j]=sigma(f[k-1][x][y]+g[k][i-x][i-y]*C(i,x)*C(j,y))
但怎么求g数组呢,可以用补集转化的思想,将完全占据的减去不完全占据的,如下:
g[k][i][j]=c[i*j][a[k]]-sigma(g[k][x][y]*c[i][x]*c[j][y])。
Tips:最后统计答案的时候还要注意下没有占满整个棋盘的情况
![](http://www.lydsy.com/JudgeOnline/upload/201309/ff.jpg)
这个题还有很有技巧的,我们用动态规划来解决(其实我很长时间都在想网络流…)令g[k][i][j]表示只用第K种颜色完全占据I行J列,f[k][i][j]表示用前K种颜色完全占据I行J列(状态的设定很巧妙啊)
容易得到:f[k][i][j]=sigma(f[k-1][x][y]+g[k][i-x][i-y]*C(i,x)*C(j,y))
但怎么求g数组呢,可以用补集转化的思想,将完全占据的减去不完全占据的,如下:
g[k][i][j]=c[i*j][a[k]]-sigma(g[k][x][y]*c[i][x]*c[j][y])。
Tips:最后统计答案的时候还要注意下没有占满整个棋盘的情况
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int maxn=1000+10; const int md=1000000009; long long f[15][33][33],g[15][33][33],c1[maxn][maxn]; int a[maxn],n,m,c; int main() { //freopen("3294.in","r",stdin); //freopen("3294.out","w",stdout); scanf("%d%d%d",&n,&m,&c); for(int i=1;i<=c;i++) scanf("%d",&a[i]); c1[0][0]=1; for(int i=1;i<=n*m;i++) { c1[i][0]=1; for(int j=1;j<=i;j++) c1[i][j]=(c1[i-1][j-1]+c1[i-1][j])%md; } for(int k=1;k<=c;k++) for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(i*j<a[k]||max(i,j)>a[k]) continue; g[k][i][j]=c1[i*j][a[k]]; for(int x=1;x<=i;x++) for(int y=1;y<=j;y++) if(x<i||y<j) { long long res=c1[i][x]*c1[j][y]%md; g[k][i][j]=(g[k][i][j]-g[k][x][y]*res%md+md)%md; } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) f[1][i][j]=g[1][i][j]; for(int k=2;k<=c;k++) for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(i*j<a[k]) continue; for(int x=1;x<i;x++) for(int y=1;y<j;y++) { long long res=c1[i][x]*c1[j][y]%md; f[k][i][j]=(f[k][i][j]+(f[k-1][x][y]%md*g[k][i-x][j-y]%md)%md*res%md)%md; } } long long ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { long long res=c1 [i]*c1[m][j]%md; ans=(ans+res*f[c][i][j]%md)%md; } printf("%lld\n",ans); return 0; }
相关文章推荐
- BZOJ3294 CQOI2011放棋子(动态规划)
- bzoj 3294: [Cqoi2011]放棋子 (容斥原理+组合数+DP)
- 【BZOJ 3294】[Cqoi2011]放棋子
- bzoj 3294: [Cqoi2011]放棋子 动态规划+排列组合
- BZOJ 3294: [Cqoi2011]放棋子
- bzoj3294[Cqoi2011]放棋子 dp+组合+容斥
- BZOJ 3294: [Cqoi2011]放棋子
- [BZOJ3294][Cqoi2011]放棋子(DP+组合数学+容斥)
- 【组合计数】【bzoj 3294】: [Cqoi2011]放棋子
- BZOJ3294 [CQOI2011]放棋子
- bzoj千题计划261:bzoj3294: [Cqoi2011]放棋子
- 【BZOJ3294】放棋子(CQOI2011)-DP+组合数学
- bzoj3294: [Cqoi2011]放棋子 容斥原理
- 【BZOJ3294】[Cqoi2011]放棋子【计数DP】
- 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)
- [BZOJ]3294: [Cqoi2011]放棋子 DP+组合数学
- 3294: [Cqoi2011]放棋子
- BZOJ P3294[Cqoi2011]放棋子
- 【CQOI2011】【BZOJ3295】动态逆序对
- 【bzoj3295】【Cqoi2011】【动态逆序对】【树状数组套平衡树】