SRM 620 D2L3: RandomGraph, dp
2015-10-04 17:55
405 查看
称号:http://community.topcoder.com/stat?
c=problem_statement&pm=13143&rd=15853
參考:http://apps.topcoder.com/wiki/display/tc/SRM+620
又是一道关于概率的题目,考虑dp方法。关键是找准突破口,将题目条件的“至少有一个大于4的连通图”转换为“全部连通图都小于等于3”。
代码:
c=problem_statement&pm=13143&rd=15853
參考:http://apps.topcoder.com/wiki/display/tc/SRM+620
又是一道关于概率的题目,考虑dp方法。关键是找准突破口,将题目条件的“至少有一个大于4的连通图”转换为“全部连通图都小于等于3”。
代码:
#include <algorithm> #include <functional> #include <numeric> #include <utility> #include <iostream> #include <sstream> #include <iomanip> #include <bitset> #include <string> #include <vector> #include <stack> #include <deque> #include <queue> #include <set> #include <map> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> #include <cstring> #include <ctime> #include <climits> using namespace std; #define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC) typedef pair<int, int> pii; typedef long long llong; typedef pair<llong, llong> pll; #define mkp make_pair /*************** Program Begin **********************/ double dp[51][51][51]; bool solved[51][51][51]; class RandomGraph { public: int n; double p; double rec(int a, int b, int c) { double & res = dp[a][b][c]; if (solved[a][b][c]) { return res; } int r = n - (a + 2 * b + 3 * c); // base case if (0 == r) { res = 1.0; solved[a][b][c] = true; return res; } res = 0.0; // r != 0 res += pow(1 - p, a + 2 * b + 3 * c) * rec(a + 1, b, c); if (a >= 1) { res += pow(1 - p, a + 2 * b + 3 * c - 1) * a * p * rec(a - 1, b + 1, c); } if (a >= 2) { res += pow(1 - p, a + 2 * b + 3 * c - 2) * p * p * a * (a - 1) / 2 * rec(a - 2, b, c + 1); } if (b >= 1) { res += pow(1 - p, a + 2 * b + 3 * c - 1) * p * 2 * b * rec(a, b - 1, c + 1); res += pow(1 - p, a + 2 * b + 3 * c - 2) * p * p * b * rec(a, b - 1, c + 1); } solved[a][b][c] = true; return res; } double probability(int n, int p) { double res = 0; this->n = n; this->p = p / 1000.0; memset(solved, 0, sizeof(solved)); res = 1 - rec(0, 0, 0); return res; } }; /************** Program End ************************/
相关文章推荐
- dev初识 拖动分组
- 生命游戏介绍
- 使用循环链表实现约瑟夫环
- Internet采用的网络协议以及该协议的主要层次结构
- tomcat的配置与安装
- Activiti入门教程十一(来杯流程喝喝吧)
- 线程,进程,任务
- BestCoder Round #58(Inversion-线段树)
- C 中的typedef应用
- 结对项目总结
- 四大域对象,和jsp的九大隐式对象,已经el表达式的11个隐式对象
- 20151004的NOIP模拟赛
- 【软件工程】结构化软件设计
- sicily 1006. Team Rankings
- 最好的单例模式 Java实现
- 第三周-删除线性表的元素
- NOIP四校联训Round2小结
- CentOS7部署LAMP之phpMyAdmin、wordpress、Discuz
- 表达式求值
- SQL Server解决分页问题(三种方法)