#191 sea(动态规划)
假设已经求出了i个点j个桥的连通图数量f[i][j],容易由此推出最终答案,套路地枚举1号点所在连通块大小即可。
假设已经求出了i个点的边双连通图数量h[i],考虑由此推出f[i][j]。可以枚举其中一座桥将图划分成两个部分,固定1号点在其中一端,将桥两端的部分方案数相乘即可。这样每种方案被考虑的次数就是其中桥的个数,最后再除一下桥个数即可。
考虑求h[i]。事实上直接将连通图数量减去f[i][1~i-1]即可。连通图计数就是经典题了,套路差不多。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define P 1000000007
#define N 55
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,f[N][N],g[N][N],h[N],C[N][N],inv[N],p[N*N],ans;
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int main()
{
freopen("sea.in","r",stdin);
freopen("sea.out","w",stdout);
n=read(),m=read();
C[0][0]=1;
for (int i=1;i<=n;i++)
{
C[i][0]=C[i][i]=1;
for (int j=1;j<i;j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;
}
inv[0]=inv[1]=1;for (int i=2;i<=n;i++) inv[i]=P-1ll*inv[P%i]*(P/i)%P;
p[0]=1;for (int i=1;i<=n*n;i++) p[i]=(p[i-1]<<1)%P;
h[1]=1;
for (int i=2;i<=n;i++)
{
for (int j=1;j<i;j++)
inc(h[i],1ll*h[j]*C[i-1][j-1]%P*p[C[i-j][2]]%P);
h[i]=(p[C[i][2]]-h[i]+P)%P;
}
f[1][0]=1;g[1][0]=1;
for (int i=2;i<=n;i++)
{
for (int j=1;j<i;j++)
{
for (int x=1;x<i;x++)
for (int y=0;y<j;y++)
inc(f[i][j],1ll*f[x][y]*f[i-x][j-y-1]%P*x%P*(i-x)%P*C[i-1][x-1]%P);
g[i][j]=f[i][j]=1ll*f[i][j]*inv[j]%P;
for (int x=1;x<i;x++)
for (int y=0;y<=j;y++)
inc(g[i][j],1ll*g[i-x][j-y]*f[x][y]%P*C[i-1][x-1]%P);
}
f[i][0]=h[i];
for (int j=1;j<i;j++) inc(f[i][0],P-f[i][j]);
g[i][0]=p[C[i][2]];
for (int j=1;j<i;j++) inc(g[i][0],P-g[i][j]);
}
int ans=0;
for (int i=0;i<=m;i++) inc(ans,g[n][i]);
cout<<ans;
return 0;
}
#191 sea(动态规划)的更多相关文章
- [hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法
今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相 ...
- 算法61---两个字符串的最小ASCII删除和【动态规划】
一.题目: 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" ...
- Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings)
Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings) 给定两个字符串s1, s2,找到 ...
- Leedcode算法专题训练(动态规划)
递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保存了子问题的解,避免重复计算. 斐波那契数列 1. 爬楼梯 70. Climbing Stairs (Easy) L ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- sea.js模块化编程
* 为什么要模块化? 解决文件依赖 解决命名冲突 ; var var2 = 2; function fn1(){ } function fn2(){ } return { fn1: fn1, fn2: ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
随机推荐
- Deno下一代Nodejs?Deno初体验
前言 Ryan Dahl之父发布了新的项目Deno,很多IT媒体都使用了标题“下一代Nodejs”,首先我们看一下Deno的特性: 1.支持typescript (nodejs目前也支持). 2.无p ...
- [书籍]用UWP复习《C#并发编程经典实例》
1. 简介 C#并发编程经典实例 是一本关于使用C#进行并发编程的入门参考书,使用"问题-解决方案-讨论"的模式讲解了以下这些概念: 面向异步编程的async和await 使用TP ...
- Python全栈开发之路 【第八篇】:面向对象编程设计与开发(2)
一.继承与派生 什么是继承? 继承指的是类与类之间的关系,是一种什么是什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创建新的类的方式,在python中,新建的类可以继承一个或多个父类 ...
- webpack--配置output
Output output 配置如何输出最终想要的代码. output 是一个 object ,里面包含一系列配置项,下面分别介绍它们. filename output.filename 配置 ...
- 2017百度软研(C++)
问了很多,不过很多也都没有问到,感觉有点偏,很深入的东西,越问越虚.第一次实习面试从百度开始,也从百度结束吧.看得见的差距,不想将就,所以还是拿最后一次机会去尝试.win or go home, 所以 ...
- github/gitlab同时管理多个ssh key
之前一直用github,但是github有一个不好的地方,要是创建私有的项目的话需要付费,而gitlab上则可以免费创建管理私有的项目.由于最近想把自己论文的一些东西整理一下,很多东西还是不方便公开, ...
- java中scanner的正确用法
Scanner s = new Scanner(System.in); int choice = 0; if(s.hasNextInt()) { choice = s.nextInt(); } s.c ...
- 【M2】软件工程终期总结报告——前端设计总结
PhylabWeb——前端设计感想 简介 本文的内容是关于我参与的软件工程项目——“Phylab-Web物理实验中心网站”的前端设计个人总结,来自团队:软剑攻城队 网站地址为:http://buaap ...
- p9半幺群
如何不理解划红线的地方?第二个划红线地方,请举一个例子 1.0不是幺元 2.f(1)=2, f(2)=1, f(3)=3, g(1)=2, g(2)=3, g(3)=1 fg不等于gf
- Mysql 5.7 Windows 版本(zip)的安装简单过程
1. 下载zip包 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-winx64.zip 2. 找一个目录解压缩 3. 简单进行安装: ...