[CQOI2011]放棋子

本文探讨了一种使用容斥原理解决棋盘覆盖问题的算法。通过定义f[i][j][k]和g[i][j][k]来分别表示前i种棋子占据j行k列的方案数和i行j列用k个棋子占据的方案数,解决了“用c个棋子,占据n行m列”的问题。关键在于避免了k之间的递推,将复杂度控制在O(n^2m^2c)。

想到了50%吧算是。

f[i][j][k]表示,前i种,占了j行k列。方案数。

发现,转移要处理:“用c个棋子,占据n行m列”的方案数。

设g[i][j][k]表示,i行j列用k个棋子占的方案数。直接处理复杂度爆炸。

然后我就mengbier了。

考虑大力容斥:

也即,总方案数-不合法方案数(不能覆盖完全)

g[i][j][k]=C(i*j,k)-∑l∑r:g[l][r][k]*C(i,l)*C(j,r) (i*j>=k&&l<=i&&j<=r)

显然由于l,r不同,不会减多。

发现不用统计所有的 k,只用统计那c个即可。

然后f[i][j][k]的转移就顺理成章了。

复杂度:O(n^2m^2c)

 

总结:

没有想到容斥那一步。。。

正难则反。

最关键的是,不用k之间的递推,所以,第三维看似是k,其实是c(10而已)

 

转载于:https://www.cnblogs.com/Miracevin/p/9845966.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值