UVA 10253Series-Parallel Networks
2016-03-19 16:42
453 查看
题意:给定n,求有n条边的串并联网络的方案数。
分析:《算法竞赛入门经典训练指南》数学基础例题7。书中给出的建模思想很好,并且对组合数学求解和dp的边界情况分析都很好。多学习,多积累。
代码:
#include<map> #include<set> #include<cmath> #include<queue> #include<bitset> #include<math.h> #include<cstdio> #include<vector> #include<string> #include<cstring> #include<iostream> #include<algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const int N=1000010; const int MAX=151; const int MOD1=1000007; const int MOD2=100000009; const double EPS=0.00000001; typedef long long ll; const ll MOD=1000000009; const ll INF=10000000010; typedef double db; typedef unsigned long long ull; ll f[35],dp[35][35]; ll C(ll n,ll m) { db ans=1; for (int i=1;i<=m;i++) ans*=n-i+1; for (int i=1;i<=m;i++) ans/=i; return (ll)(ans+0.5); } int main() { int i,j,k,n=30; f[1]=1; memset(dp,0,sizeof(dp)); for (i=0;i<=n;i++) dp[i][0]=1; for (i=1;i<=n;i++) { dp[0][i]=0;dp[i][1]=1; } for (i=1;i<=n;i++) { for (j=2;j<=n;j++) { dp[i][j]=0; for (k=0;k*i<=j;k++) dp[i][j]+=C(f[i]+k-1,k)*dp[i-1][j-k*i]; } f[i+1]=dp[i][i+1]; } while (scanf("%d", &n)&&n) printf("%lld\n", n==1 ? 1:2*f ); return 0; }
相关文章推荐
- 51.iOS9 新特性及适配
- 【leetcode】Array——Find the Duplicate Number(287)
- 进程
- 好站
- 数字运算
- Android-屏幕适配全攻略(绝对详细)(二)
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- UNIX网络编程之旅-配置unp.h头文件环境
- 打印整数划分
- 前端代码重构
- 第三周学习进度条
- Description Resource Path Location Type The project was not built since its
- Codeforce 327D 二分
- android中内存泄漏和内存溢出的区别
- 继承和多态------虚析构函数(二)
- Recommended Django Project Layout
- POJ 1182 食物链 并查集
- 当应用程序不是以UserInteractive 模式运行时显示模式对话框或窗体
- 【网页设计】行业文字规范你知道吗?太原UI设计师讲
- POJ 1182 食物链 并查集