参考: http://blog.csdn.net/gjghfd/article/details/77824901

所求的是满足条件的图中“不同构”的数量,意味着操作的顺序是可以忽略的。考虑若干次操作后得到的一个“World” G,其中某次操作(s(G), t(G))生成的节点为w,则由s(G)到w和由w到t(G)的所有路径及途径点生成的两个子图分别符合“World”的定义。

这意味着我们可以将一个“World”分割成若干个子问题来求解。

不妨令F(N, M)表示经N次操作后得到的s(G)与t(G)之间最小割为M的所有不同构的G的数量。考虑N次操作中所有基于u=s(G), v=t(G)的操作生成的子“world”,如图所示:

则有$$N = \sum_i (a_i + c_i + 1) \\ M = \sum_i \min\{b, d\} $$

由此可以按照a, b, c, d对这些成对的子世界分类,令$$g(i, j) = \sum_{a+c+1=i \land min\{b, d\} = j} F(a, b) * F(c, d) $$

这样我们就可以类比背包问题的求解过程,从小到大依次求出g(i, j),并用g(i, j)更新F的答案。

考虑当前要将t组在g(i, j)中的“子世界对”放入背包,而F(x,y)是尚未考虑将g(i, j)作为子世界的情况的世界数量,那么状态转移的过程就相当于在g(i,j)中可重复地选取t个子世界对,使得总操作数变为x+t*i,总割集变为y+t*j。由于“同构”的定义不考虑操作的顺序,上述转移的方案数应为$\binom{g(i, j) + t - 1}{t} $

即状态转移为$$F(x, y) \cdot \binom{g(i, j) + t - 1}{t} \Longrightarrow F(x+t*i, y+t*j)$$

代码实现如下

 By Asm.Def, contest: Codeforces Round # (Div. ), problem: (D) Shake It!, Accepted, #

 #include <bits/stdc++.h>
using namespace std;
const int maxn = , mod = ;
typedef long long LL;
int N, M, F[maxn][maxn], G[maxn][maxn], inv[maxn]; void init()
{
scanf("%d%d", &N, &M);
inv[] = ;
for(int i = ;i < maxn;++i)
inv[i] = LL(mod-mod/i) * inv[mod%i] % mod;
}
void work()
{
F[][] = ;
for(int i = ;i <= N;++i) for(int j = ;j < maxn;++j)
{
for(int a = ;a < i;++a)
{
G[i][j] = (G[i][j] + (LL) F[a][j] * F[i--a][j]) % mod;
for(int b = j+;b <= i+ && b < maxn;++b)
{
G[i][j] = (G[i][j] + (LL) F[a][b] * F[i--a][j]) % mod;
G[i][j] = (G[i][j] + (LL) F[a][j] * F[i--a][b]) % mod;
}
}
//get G[i][j]
for(int x = N-;x >= ;--x) for(int y = ;y < maxn;++y) if(F[x][y])
{
int C = ;
for(int t = ;x+t*i <= N && y+t*j < maxn;++t)
{
C = (LL) C * (G[i][j]-+t) % mod * inv[t] % mod;
F[x+t*i][y+t*j] = (F[x+t*i][y+t*j] + (LL) F[x][y] * C) % mod;
}
}
}
printf("%d\n", F[N][M]);
}
int main()
{
init();
work();
return ;
}

动态规划

【Codeforces 949D】Shake It! 【动态规划】的更多相关文章

  1. Codeforces 839C Journey - 树形动态规划 - 数学期望

    There are n cities and n - 1 roads in the Seven Kingdoms, each road connects two cities and we can r ...

  2. Codeforces 834D The Bakery - 动态规划 - 线段树

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  3. Codeforces 837D Round Subset - 动态规划 - 数论

    Let's call the roundness of the number the number of zeros to which it ends. You have an array of n ...

  4. CodeForces 623E Transforming Sequence 动态规划 倍增 多项式 FFT 组合数学

    原文链接http://www.cnblogs.com/zhouzhendong/p/8848990.html 题目传送门 - CodeForces 623E 题意 给定$n,k$. 让你构造序列$a( ...

  5. Codeforces 101623E English Restaurant - 动态规划

    题目传送门 传送门 题目大意 餐厅有$n$张桌子,第$i$张桌子可以容纳$c_i$个人,有$t$组客人,每组客人的人数等概率是$[1, g]$中的整数. 每来一组人数为$x$客人,餐厅如果能找到最小的 ...

  6. Codeforces 264C Choosing Balls 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF264C.html 题目传送门 - CF264C 题意 给定一个有 $n$ 个元素的序列,序列的每一个元素是个 ...

  7. Codeforces 1000G Two-Paths 树形动态规划 LCA

    原文链接https://www.cnblogs.com/zhouzhendong/p/9246484.html 题目传送门 - Codeforces 1000G Two-Paths 题意 给定一棵有 ...

  8. codeforces 17C Balance(动态规划)

    codeforces 17C Balance 题意 给定一个串,字符集{'a', 'b', 'c'},操作是:选定相邻的两个字符,把其中一个变成另一个.可以做0次或者多次,问最后可以生成多少种,使得任 ...

  9. Codeforces 762D Maximum path 动态规划

    Codeforces 762D 题目大意: 给定一个\(3*n(n \leq 10^5)\)的矩形,从左上角出发到右下角,规定每个格子只能经过一遍.经过一个格子会获得格子中的权值.每个格子的权值\(a ...

随机推荐

  1. 【原创】Linux环境下的图形系统和AMD R600显卡编程(1)——Linux环境下的图形系统简介

    Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过扩展的方式以适应显卡和桌面图形发展的需要,然而随着软硬件的发展,特别是嵌入式系统的发展,Xorg显得庞大而落后.开源社区 ...

  2. CEC2017 benchmark function调用接口

    CEC2017 benchmark function可以从这里下载. 导师最近给了个课题让我自己研究,跟智能优化算法相关的,必不可免的要用到最新的CEC2017 benchmark function, ...

  3. Pytorch数据变换(Transform)

    实例化数据库的时候,有一个可选的参数可以对数据进行转换,满足大多神经网络的要求输入固定尺寸的图片,因此要对原图进行Rescale或者Crop操作,然后返回的数据需要转换成Tensor如: import ...

  4. RocketMQ使用

    RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,并于2016年11月成为 Apache 孵化项目. 中间件是一类连接软件组件和应用的计算机软件,它包括一 ...

  5. Python基础三(选择,循环)

    序 首先我们知道程序的执行有三种结构:顺序.选择.循环三种结构,而为了方便我们书写和多次利用我们就需要把一段代码封装器来,这就是方法.今天我就说的是程序的基本结构的格式和方法. 注:所有的程序都可以通 ...

  6. JS点击事件的重叠处理(多个点击事件出现冲突)

    最近开发遇见了一个这个样的情况,一个button在一个div中,点击buton是一个事件,点击大的div也是一个事件,但是由于button在div中,点击button会把两个事件都执行了,但是我们想点 ...

  7. No.14 selenium for python table表单

    table表单,HTML中的特征 标识性标签:table.tr.th.td 定位使用Xpath定位 点击表格中的元素即可

  8. git —— bug分支

    储藏工作现场 $ git stash 切换到需要修改bug的分支,创建临时分支 修复bug,修复完提交 修复完之后,切换到需要修改的分支.完成合并 合并后删除临时分支 完成后,可以重新回到没有修改完的 ...

  9. 使用html+css+js实现3D相册

    使用html+css+js实现3D相册,快来上传的照片吧 效果图: 代码如下,复制即可用: <!DOCTYPE html> <html lang="en"> ...

  10. ThinkPHP中的四种路由形式

    1.普通形式路由(get形式路由) 路由形式:http://网址/入库文件?m=分组&c=控制器&c=控制器&a=方法名&参数=参数 例子:http://localho ...