poj 1737男人八题之一 orz ltc
这是楼教主的男人八题之一。很高兴我能做八分之一的男人了。
题目大意:求有n个顶点的连通图有多少个。
解法:
1、 用总数减去不联通的图(网上说可以,我觉得时间悬)
2、 用动态规划(数学递推)。网上讲的方法我觉得非常难懂,但好像也没有更好的表示。我就说一下吧:
用dp[i]表示i个顶点时的连通图的总数。
考虑将1号点去除后,2号点所在的联通块。设此联通块有k个点,则这块共有C(n-2,k-1)种取法。
回过头来看刚开始的图。可以把图分成两块,一是上述联通块,其余的另一块(此块也一定联通),这两块之间至少有一条连线,而这些线段肯定有一个顶点是1号点(用反证法很容易得到)。K个顶点连线到1号点的情况总共有2^k种,去除一种都不连的情况,还剩(2^k)-1种。故此时共有dp[j]*dp[i-j]*((2^k)-1)*C(n-2,k-1)
综上,dp[i]=sigma{ dp[j]*dp[i-j]*((2^k)-1)*C(n-2,k-1)} (1<=j<i)
最后提醒一句,虽然大家都知道:要用高精度
代码:
#include<cstdio>
#include<cstring>
using namespace std;
int max(int x,int y){
return(x>y)?x:y;
}
struct bign{
int len,p[240];
bign(){
len=1;
memset(p,0,sizeof(p));
}
bign operator =(const bign &o){
len=o.len;
memcpy(p,o.p,sizeof(p));
return *this;
}
bign operator +(const bign &o){
bign ans;
ans.len=max(len,o.len)+1;
int g=0;
for(int i=0;i<ans.len;i++){
int x=p[i]+o.p[i]+g;
ans.p[i]=x%10000;
g=x/10000;
}
if(ans.p[ans.len-1]==0)ans.len--;
return ans;
}
bign operator *(const bign &o){
bign ans;
ans.len=len+o.len;
for(int i=0;i<len;i++)
for(int j=0;j<o.len;j++){
ans.p[i+j]+=p[i]*o.p[j];
ans.p[i+j+1]+=ans.p[i+j]/10000;
ans.p[i+j]%=10000;
}
while(ans.p[ans.len-1]==0)ans.len--;
return ans;
}
void print(){
printf("%d",p[len-1]);
for(int i=len-2;i>=0;i--){
if(p[i]<10)printf("000%d",p[i]);
if(p[i]>=10 && p[i]<100)printf("00%d",p[i]);
if(p[i]>=100 && p[i]<1000)printf("0%d",p[i]);
if(p[i]>=1000 && p[i]<10000)printf("%d",p[i]);
}
printf("\n");
return;
}
}dp[51],tmp,c[51][51],two[51];
void init(bign &x){
x.len=1;
memset(x.p,0,sizeof(x.p));
x.p[0]=1;
return;
}
int main(){
int n;
scanf("%d",&n);
init(two[0]);
for(int i=1;i<=50;i++)
two[i]=two[i-1]+two[i-1];
for(int i=0;i<=50;i++)
two[i].p[0]--;
init(c[0][0]);
for(int i=1;i<=50;i++){
init(c[i][0]);init(c[i][i]);
for(int j=1;j<i;j++)
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
init(dp[2]);init(dp[1]);
for(int i=3;i<=50;i++){
for(int j=1;j<i;j++)
dp[i]=dp[i]+dp[j]*dp[i-j]*two[j]*c[i-2][j-1];
}
while(n!=0){
dp[n].print();
scanf("%d",&n);
}
return 0;
}
poj 1737男人八题之一 orz ltc的更多相关文章
- poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串
		Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14874 Accepted: 5118 De ... 
- poj 1741  楼教主男人八题之中的一个:树分治
		http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ... 
- POJ1742 Coins(男人八题之一)
		前言 大名鼎鼎的男人八题,终于见识了... 题面 http://poj.org/problem?id=1742 分析 § 1 多重背包 这很显然是一个完全背包问题,考虑转移方程: DP[i][j]表示 ... 
- Cogs 1714. [POJ1741][男人八题]树上的点对(点分治)
		[POJ1741][男人八题]树上的点对 ★★★ 输入文件:poj1741_tree.in 输出文件:poj1741_tree.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] ... 
- poj 1742(好题,楼天城男人八题,混合背包)
		Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 33269 Accepted: 11295 Descripti ... 
- 博弈论(男人八题):POJ 1740 A New Stone Game
		A New Stone Game Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5694 Accepted: 3119 ... 
- 新男人八题---AStringGame
		终于完成进度男人1/8,为了这题学了sam= = 题意先有一个串,n个子串,两个人轮流每次在子串上加字符,要求加完后还是原串的子串,最后不能加的就是输者,求赢的人 解法:sam之后在构造的状态图上跑s ... 
- nyoj137 取石子(三) 楼教主男人八题之一
		思路:一堆时,N态.两堆时,当两堆数量相同,P态,不同为N态.三堆时,先手可以变成两堆一样的,必胜N态. 此时可以总结规律:堆数为偶数可能且石子数都是两两相同的,为P态.分析四堆时,当四堆中两两数量一 ... 
- POJ 1737 Connected Graph 题解(未完成)
		Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ... 
随机推荐
- 细说 Form (表单)
			细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ... 
- codevs 3110 二叉堆练习3
			3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ... 
- 微信H5中的一些坑
			最近在写微信公众号H5页面 遇到了一些坑,在这里记录一下 记录一下signature的计算 // 首先找到hex_sha1的加密算法,ticket 是后端提供的 var url_local = loc ... 
- [LeetCode] Binary Tree Vertical Order Traversal 二叉树的竖直遍历
			Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ... 
- [LeetCode] Delete Node in a Linked List 删除链表的节点
			Write a function to delete a node (except the tail) in a singly linked list, given only access to th ... 
- 学习ASP.NET 5和MVC6
			今天很荣幸的参加了微软开源跨平台讲座,充分认识了下一个版本的ASP.NET所带来的激动人心的特性.虽然过去已经断断续续的了解了一些ASP.NET5和MVC6与EF7的动态,但是都没有这一次来的系统化( ... 
- 在mysql 查询语句中将时间戳格式转化为年月日格式
			SELECT FROM_UNIXTIME('时间戳的字段名称', '%Y-%m-%d %H:%i:%s') FROM `表名` http://www.cnblogs.com/tdalcn/arc ... 
- 关于闭包(closure)的一些概念
			和其他大多数现代编程语言一样,JS也采用词法作用域,也就是说,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的.为了实现这种词法作用域,JS函数对象的内部状态不仅包含 ... 
- Leetcode 69. Sqrt(x)
			Implement int sqrt(int x). 思路: Binary Search class Solution(object): def mySqrt(self, x): "&quo ... 
- git的详细说明文档
			http://www.ihref.com/read-16369.html fork 后如何保持同步 http://www.tuicool.com/articles/6vayqen git clone ... 
