Hdu 5155 Harry And Magic Box
2016-06-10 15:23
405 查看
在n×m的盒子中有多少种放置石头的方案使得每一行每一列都至少有一个石头(0≤n,m≤50)
这个dp计数的状态感觉也是十分的炫酷
dpi,j表示前i行每一行都至少有一个石头并且有且仅有j列有石头(也就是剩下m−j列都是空列)的方案数。
这样的话答案就是dpn,m
然后我们考虑状态转移,考虑状态dpi,j从哪里转移过来
考虑第i行我们恰好放置k个石子,已有的状态是前i−1行恰好有j−t列放置有石头
假设这k个石子中有t个是放在空列的下面的,剩下的k−t个放在非空列的下面
前一部分的方案数为 (空列的个数k) ,后一部分的方案为(非空列的个数k−t)
因为两部分是独立的,所以可以直接乘起来,也就是
dpi,j=∑k=1j∑t=0kdpi−1,j−t×(m−j+tt)×(j−tk−t)
这个dp计数的状态感觉也是十分的炫酷
dpi,j表示前i行每一行都至少有一个石头并且有且仅有j列有石头(也就是剩下m−j列都是空列)的方案数。
这样的话答案就是dpn,m
然后我们考虑状态转移,考虑状态dpi,j从哪里转移过来
考虑第i行我们恰好放置k个石子,已有的状态是前i−1行恰好有j−t列放置有石头
假设这k个石子中有t个是放在空列的下面的,剩下的k−t个放在非空列的下面
前一部分的方案数为 (空列的个数k) ,后一部分的方案为(非空列的个数k−t)
因为两部分是独立的,所以可以直接乘起来,也就是
dpi,j=∑k=1j∑t=0kdpi−1,j−t×(m−j+tt)×(j−tk−t)
#include<cstdio> #include<cctype> #include<cassert> #include<cstring> #include<stack> #include<algorithm> #include<vector> #include<cstring> using namespace std; #define LL long long const int maxn = 55; const int mod = 1000000007; LL dp[maxn][maxn]; LL c[maxn][maxn]; void init(){ memset(c,0,sizeof(c)); c[0][0] = 1; for(int i=1;i<=50;i++){ for(int j=0;j<=i;j++){ c[i][j] = (c[i-1][j] + (j>0?c[i-1][j-1]:0) ) % mod; } } } int main(){ int n,m; init(); while(~scanf("%d %d",&n,&m)){ memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++){ dp[1][i] = c[m][i]; for(int i=2;i<=n;i++){ for(int j=1;j<=m;j++){ for(int k=1;k<=j;k++){ for(int t=0;t<=k;t++){ (dp[i][j] += ( dp[i-1][j-t] * c[m-j+t][t] ) % mod * c[j-t][k-t] ) %= mod; } } } } printf("%I64d\n",dp [m]); } return 0; }
相关文章推荐
- spring 集成shiro 之 自定义过滤器
- Android 关闭WebView之后 ,声音或者视频不停止
- <Hadoop>Spark On Hadoop集群安装
- 计算机组成.更好的利用处理器.从输入输出看中断
- 一款二维码签到app
- RAR文件的图标不能正常显示为压缩包的图标解决办法
- Calibration of Short Range 2D Laser Range Finder for 3D SLAM Usage
- 系统调用方式创建文件--文件属性
- latex使用marvosym 宏包来替换logo图标
- 编码表的概述和常见编码表
- 巧用PropertyInfo简化和改善代码
- Win7如何部署apache服务器(包括SSL设置)
- Servlet3.0中Servlet的使用
- 运维自动化工具Cobbler之――安装实践
- 网络编程
- Serializable和Pacerlable
- PHP中常用的字符串格式化函数总结
- Android 数据库升级解决方案
- C++之派生类的友元
- Python2.7.X 中文注释