题目:

洛谷3158

分析:

某OIer兔崽子的此题代码中的三个函数名:dfs、ddfs、dddfs(充满毒瘤的气息

显然,行与行之间、列与列之间是互相独立的。考虑背包,用\(f[k][i][j]\)表示用前\(k\)种颜色占了\(i\)行\(j\)列的方案数,\(g[i][j]\)表示用颜色\(k\)占据\(i\)行\(j\)列的方案数,\(c[i]\)表示颜色为\(i\)的棋子数,就有如下方程:

\[f[k][i][j]=\sum _{a=0}^i \sum_{b=0}^j f[k-1][i-a][j-b]\times g[a][b]\times C_{n-(i-a)}^a\times C_{m-(j-b)}^b(ab\geq c[i])
\]

\(g[i][j]\)在算的时候注意要减去有空行或空列的情况(枚举有多少行、列不是空的)。注意要\(a=i\)且\(b=j\)的情况要跳过:

\[g[i][j]=C_{ij}^{c[k]}-\sum_{a=0}^i \sum_{b=0}^j g[a][b]\times C_i^a \times C_j^b(ij\geq c[k])
\]

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std; namespace zyt
{
template<typename T>
inline void read(T &x)
{
char c;
bool f = false;
x = 0;
do
c = getchar();
while (c != '-' && !isdigit(c));
if (c == '-')
f = true, c = getchar();
do
x = x * 10 + c - '0', c = getchar();
while (isdigit(c));
if (f)
x = -x;
}
template<typename T>
inline void write(T x)
{
static char buf[20];
char *pos = buf;
if (x < 0)
putchar('-'), x = -x;
do
*pos++ = x % 10 + '0';
while (x /= 10);
while (pos > buf)
putchar(*--pos);
}
typedef long long ll;
const int N = 40, T = 20, p = 1e9 + 9;
int n, m, c, arr[T], C[N * N][N * N], f[T][N][N], g[N][N];
void init()
{
for (int i = 0; i < N * N; i++)
{
C[i][0] = 1;
for (int j = 1; j <= i; j++)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % p;
}
}
int work()
{
init();
read(n), read(m), read(c);
for (int i = 1; i <= c; i++)
read(arr[i]);
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 >= arr[k])
{
g[i][j] = C[i * j][arr[k]];
for (int a = 0; a <= i; a++)
for (int b = 0; b <= j; b++)
{
if (a != i || b != j)
g[i][j] = (g[i][j] - (ll)g[a][b] *
C[i][a] % p * C[j][b] % p + p) % p;
}
}
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int a = 1; a <= i; a++)
for (int b = 1; b <= j; b++)
if (a * b >= arr[k])
f[k][i][j] = (f[k][i][j] +
(ll)f[k - 1][i - a][j - b] * g[a][b] % p *
C[n - (i - a)][a] % p * C[m - (j - b)][b]) % p;
}
int ans = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
ans = (ans + f[c][i][j]) % p;
write(ans);
return 0;
}
}
int main()
{
return zyt::work();
}

【BZOJ3294/洛谷3158】[CQOI2011]放棋子(组合数+DP)的更多相关文章

  1. 洛谷P3158 [CQOI2011]放棋子 组合数学+DP

    题意:在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少祌方法? 解法:这道题不会做,太菜了qwq.题解是看洛谷大佬的. 设C是组合数, ...

  2. [洛谷P3158] [CQOI2011]放棋子

    洛谷题目链接:[CQOI2011]放棋子 题目描述 在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同 颜色的棋子不能在同一行或者同一列.有多少祌方法?例如,n=m=3,有两个 ...

  3. P3158 [CQOI2011]放棋子(dp+组合数)

    P3158 [CQOI2011]放棋子 放棋子的顺序和方案数无关,所以可以从按颜色递推 设$f[u][p][k]$为放到第$u$种颜色,所剩空间$p*k$的方案数 $g[u][i][j]$表示第$u$ ...

  4. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)

    3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...

  5. [CQOI2011]放棋子 (DP,数论)

    [CQOI2011]放棋子 \(solution:\) 看到这道题我们首先就应该想到有可能是DP和数论,因为题目已经很有特性了(首先题面是放棋子)(然后这一题方案数很多要取模)(而且这一题的数据范围很 ...

  6. 洛谷 P3182 [HAOI2016]放棋子(高精度,错排问题)

    传送门 解题思路 不会错排问题的请移步——错排问题 && 洛谷 P1595 信封问题 这一道题其实就是求对于每一行的每一个棋子都放在没有障碍的地方的方案数. 因为障碍是每行.每列只有一 ...

  7. 洛谷P3182 [HAOI2016]放棋子

    P3182 [HAOI2016]放棋子 题目描述 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要 ...

  8. luogu 3158 [CQOI2011]放棋子

    时隔多日 我又来挑战这道dp. 几个月前给写自闭了.几个月后再来. 首先一个我们能列出来的状态 是以行为转移的 f[i]表示前i行...但是会发现此时列我们控制不了 且棋子的颜色,个数我们也要放到状态 ...

  9. 洛谷 P3182 [HAOI2016]放棋子(错排问题)

    题面 luogu 题解 裸的错排问题 错排问题 百度百科:\(n\)个有序的元素应有\(n!\)个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排:有的叫重排.如,1 2的错 ...

随机推荐

  1. 洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree

    [题解] 蜜汁强制在线... 每个点开一个从它到根的可持久化权值线段树.查询的时候利用差分的思想在树上左右横跳就好了. #include<cstdio> #include<algor ...

  2. 洛谷 1712 BZOJ 4653 [NOI2016]区间

    [题解] 先把区间按照未离散化的长度排序,保存区间长度,然后离散化区间端点.每次把区间覆盖的点的覆盖次数加1,如果某个点被覆盖次数大于等于m,就从前往后开始删除区间直到没有一个点被覆盖的次数大于等于m ...

  3. SRAM的简单概念

    CY7C138 版权声明:本文为博主原创文章,未经博主允许不得转载.

  4. nyoj 113 字符串替换 (string中替换函数replace()和查找函数find())

    字符串替换 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 编写一个程序实现将字符串中的所有"you"替换成"we"   输入 ...

  5. Luogu P1257 平面上的最接近点对 暴力

    这道题数据不大 两点距离用勾股定理求 #include<iostream> #include<cmath> using namespace std; struct node{ ...

  6. 最大公约数GCD

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= ...

  7. codevs4343 找回密码

    题目描述 Description jrMz 很喜欢动漫<叛逆的鲁鲁修>(额= =不知道是不是因为他盯上了动画片里的 MM),他准备以一种神奇的方式降临<叛逆的鲁鲁修>世界,所以 ...

  8. kendo中需要kendo.default.min.css

    kendo中需要kendo.default.min.css,这个默认是没有加入头文件的,还是需要手动加入一下 <link href="~/Scripts/kendo/styles/ke ...

  9. namenode启动成功,但是不能通过web访问50070问题

    我在CentOS遇到这个问题,50070不行但8088可以,尝试了各种方法无法解决,各个进程全都启动,格式化namenode,各种配置正常均无法解决.后来觉得是默认访问端口没有生效,所以尝试添加端口配 ...

  10. Android:Unable to resolve target ‘android-8’问题解决

    在学习过程中,下载别人写过的代码,导入到eclipse,报错: Unable to resolve target 'android-8' 问题是项目版本号问题. 解决方法例如以下: 右击项目:Prop ...