题目链接:HDOJ - 5155

题目大意

有一个 n * m 的棋盘,已知每行每列都至少有一个棋子,求可能有多少种不同的棋子分布情况。答案对一个大素数取模。

题目分析

算法1:

  使用容斥原理与递推。

  首先,一个 n * m 的棋盘不考虑任何限制时,可能的分布情况为 2^(n*m) ,除去没有棋子的情况,为 2^(n*m) - 1 。

  然后,因为所有的 n 行,m 列都有棋子,所以枚举 ii (1 <= ii <= i) , jj (1 <= jj <= j) 。对于枚举的一组 (ii, jj) ,若 (ii, jj) != (i, j) ,f[i][j] 就是恰好有 i 行 j 列都有棋子的情况数,再乘上在 i 行中选 ii 行 ( C[i][ii] ) ,在 j 列中选 jj 列的情况数( C[j][jj] ),就是在 i * j 的棋盘中,恰好有 ii 行, jj 列有棋子的情况数。(i, j) 的答案 f[i][j] 要减去这个值。

  这样就递推出了所有的 f[i][j] 。时间复杂度 O(n^4) 。

  注意的问题:组合数用递推来求。 C[i][0] = 1, C[i][j] = C[i-1][j-1] + C[i-1][j]; 进行递推时注意取模之后的数相乘会爆 Int 。

算法2:

  考虑一种 DP ,使用 f[i][j] 表示前 i 行都有棋子,然而只有 j 列有棋子的方案数。

  那么我们考虑第 i + 1 行的棋子放置情况,我们枚举第 i + 1 行棋子放置的个数 k ,再枚举这 k 个棋子中有 t 个放在之前没有棋子的列中。

  那么就有一个状态转移 : f[i+1][j+t] += f[i][j] * C[j][k-t] * C[m-j][t] 。

  时间复杂度同样是 O(n^4) 。

代码

算法1

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; const int MaxN = 50 + 5, Mod = 1000000007; int n, m;
int C[MaxN][MaxN], f[MaxN][MaxN], Pow2[MaxN * MaxN]; void Init_C() {
C[0][0] = 1;
for (int i = 1; i <= 50; ++i) {
C[i][0] = 1;
for (int j = 1; j <= i; ++j) {
C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
C[i][j] %= Mod;
}
}
Pow2[0] = 1;
for (int i = 1; i <= 2500; ++i) {
Pow2[i] = Pow2[i - 1] << 1;
Pow2[i] %= Mod;
}
} typedef long long LL; int main()
{
Init_C();
for (int i = 1; i <= 50; ++i) {
for (int j = 1; j <= 50; ++j) {
f[i][j] = Pow2[i * j] - 1;
for (int ii = 1; ii <= i; ++ii) {
for (int jj = 1; jj <= j; ++jj) {
if (ii == i && jj == j) continue;
f[i][j] -= (LL)f[ii][jj] % Mod * (LL)C[i][ii] % Mod * (LL)C[j][jj] % Mod;
f[i][j] %= Mod;
}
}
f[i][j] = (f[i][j] + Mod) % Mod;
}
}
while (scanf("%d%d", &n, &m) != EOF) {
if (n == 0 || m == 0) {
printf("1\n"); continue;
}
printf("%d\n", f[n][m]);
}
return 0;
}

  

算法2就不写代码了。

[HDOJ 5155] Harry And Magic Box的更多相关文章

  1. 【HDOJ】5155 Harry And Magic Box

    DP.dp[i][j]可以表示i行j列满足要求的组合个数,考虑dp[i-1][k]满足条件,那么第i行的那k列可以为任意排列(2^k),其余的j-k列必须全为1,因此dp[i][j] += dp[i- ...

  2. HDU 5155 Harry And Magic Box --DP

    题意:nxm的棋盘,要求每行每列至少放一个棋子的方法数. 解法:首先可以明确是DP,这种行和列的DP很多时候都要一行一行的推过去,即至少枚举此行和前一行. dp[i][j]表示前 i 行有 j 列都有 ...

  3. 【hihocoder】 Magic Box

    题目1 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. When ...

  4. hihocoder 1135 : Magic Box

    #1135 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. Whe ...

  5. BestCoder Round #25 1002 Harry And Magic Box [dp]

    传送门 Harry And Magic Box Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  6. 微软2016校园招聘在线笔试之Magic Box

    题目1 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. When ...

  7. Harry And Magic Box HDU - 5155

    题目链接:https://vjudge.net/problem/HDU-5155#author=0 题意:在一个n*m的方格中要满足每一行每一列至少有一个珠宝,问总共有多少种方案. 思路:利用递推的思 ...

  8. D. Magic Box(几何)

    One day Vasya was going home when he saw a box lying on the road. The box can be represented as a re ...

  9. 【HDOJ】3183 A Magic Lamp

    RMQ. /* 3183 */ #include <cstdio> #include <cstring> #include <cstdlib> #define MA ...

随机推荐

  1. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

  2. 如何优化cocos2d程序的内存使用和程序大小:第一部分_(转)

    译者: 在我完成第一个游戏项目的时候,我深切地意识到“使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰”.而我刚开始接触cocos2d的时候,社区里面的人们讨论了一个 ...

  3. 吧php脚本打包成 exe程序

    操作方法 :FQ哦 https://www.youtube.com/watch?v=UQ3zxqh1YXY 有很多方法可以实现 找了个外国的哥们制作的工具 可以吧文件生成很简单的一个独立EXE文件 下 ...

  4. android 49 广播接收者中启动其他组件

    main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...

  5. Xcode常见报错及解决办法

    报错一: 在iOS7的真机运行时,弹出错误:App installation failed. There was an internal API error. 如图 解决办法: 在Xcode -> ...

  6. JAVA异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  7. 规范javascript书写

    空白 缩进 换行限制 if while for do 2.  命名 常量 URL_CONFIG 变量 listLen 函数命名 调用函数  function setStyle(dom, name, v ...

  8. css 嵌套 元素所属类别

    元素所属类别 Metadata content(元数据元素)(8) base,link,meta,noscript,script,style,template, title Flow content( ...

  9. 第五篇:python基础之循环结构以及列表

    python基础之循环结构以及列表   python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.pyth ...

  10. ASP.NET MVC 第四回 向View传值

    一.ViewData与TempData属性来向View页传递对象 上文中已经提到,使用ViewData可以将数据由Controller传递到View 在前文中我们建立了EiceController类  ...