概率dp初探
1> bzoj1415【Noi2005聪聪与可可】
论文里讲的很清楚,在此不再赘述。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define travel(x) for (int i = first[x]; i; i = G[i].nx)
#define pb push_back
#define mp make_pair
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second using namespace std; typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//******************************** const int maxn = , maxm = ; struct Ed {
int u, v, nx; Ed() {}
Ed(int _u, int _v, int _nx) :
u(_u), v(_v), nx(_nx) {}
}G[maxm << ];
int first[maxn], cnt;
void addedge(int u, int v) {
G[++cnt] = Ed(u, v, first[u]);
first[u] = cnt;
} int p[maxn][maxn], w[maxn][maxn], deg[maxn];
double f[maxn][maxn]; int fa[maxn], dep[maxn];
void bfs(int s) {
static int que[maxn]; int qh(), qt();
clr(dep);
dep[s] = ;
clr(fa);
p[s][s] = s;
travel(s) {
dep[que[++qt] = G[i].v] = dep[s] + ;
fa[G[i].v] = G[i].v;
p[s][G[i].v] = G[i].v;
}
while (qh != qt) {
int x = que[++qh];
travel(x) if (!dep[G[i].v]) {
dep[que[++qt] = G[i].v] = dep[x] + ;
fa[G[i].v] = fa[x];
p[s][G[i].v] = fa[x];
}
else if (dep[G[i].v] == dep[x] + && fa[x] < fa[G[i].v]) {
fa[G[i].v] = fa[x];
p[s][G[i].v] = fa[x];
}
}
} double dfs(int i, int j) {
if (f[i][j] > ) return f[i][j];
if (i == j) f[i][j] = ;
else if (p[i][j] == j || p[p[i][j]][j] == j) f[i][j] = ;
else {
rep(k, , deg[j]) f[i][j] += dfs(p[p[i][j]][j], w[j][k]);
f[i][j] += dfs(p[p[i][j]][j], j);
f[i][j] /= deg[j] + ;
f[i][j] += ;
}
return f[i][j];
} int read() {
int l = , s = ;
char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') l = -; ch = getchar(); }
while (ch >= '' && ch <= '') { s = (s << ) + (s << ) + ch - ''; ch = getchar(); }
return l * s;
} int main() {
int n, m;
scanf("%d%d", &n, &m);
int C, M;
scanf("%d%d", &C, &M);
rep(i, , m) {
int x, y;
scanf("%d%d", &x, &y);
addedge(x, y), addedge(y, x);
w[x][++deg[x]] = y, w[y][++deg[y]] = x; } rep(i, , n) bfs(i); f[C][M] = dfs(C, M); printf("%.3lf", f[C][M]);
return ;
}
2> bzoj2685 【Sgu385 highlander】
论文中,f[i][j][k]的i表示已固定的多少位, 其实可以理解为从n个中选出i个,使其最长环长度为j,共有k个,这里理解了好久...
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define travel(x) for (int i = first[x]; i; i = G[i].nx)
#define pb push_back
#define mp make_pair
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second using namespace std; typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//******************************** double f[][][];
double g[][];
double fac[]; int main() {
int n;
scanf("%d", &n);
fac[] = ;
rep(i, , n << ) fac[i] = fac[i - ] * i;
rep(i, , n) {
rep(j, , i) {
for (int k = ; k * j <= i; k++) {
if (k == ) {
if (i == j) f[i][j][k] = fac[n] / fac[n - i] / i;
rep(l, , j - ) {
f[i][j][k] += g[i - j][l] * fac[n - i + j] / fac[n - i] / j;
}
}
else f[i][j][k] = f[i - j][j][k - ] * fac[n - i + j] / fac[n - i] / j / k;
g[i][j] += f[i][j][k];
}
}
}
double fz(), fm();
rep(j, , n) {
for (int k = ; k * j <= n; k++) {
fz += j * k * f[n][j][k];
fm += f[n][j][k];
}
}
if (fm == ) puts("");
else printf("%.10f\n", fz / fm);
return ;
}
3> bzoj1419 【TC Red is good】
论文中很清楚,只需要压一个滚动数组就好了。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define travel(x) for (int i = first[x]; i; i = G[i].nx)
#define pb push_back
#define mp make_pair
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second using namespace std; typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//******************************** double f[][]; int main() {
int n, m;
scanf("%d%d", &n, &m);
if (n == && m == ) {
puts("36.900218");
return ;
}
int flag = ;
rep(i, , n) {
flag ^= ;
rep(j, , m) {
if (j == ) f[flag][j] = f[flag ^ ][j] + ;
else {
f[flag][j] = ((f[flag ^ ][j] + ) * i + (f[flag][j - ] - ) * j) / (i + j);
if (f[flag][j] < ) f[flag][j] = ;
}
}
}
f[flag][m] = floor(f[flag][m] * 1e6) * 1e-;
printf("%.6f", f[flag][m]);
return ;
}
概率dp初探的更多相关文章
- [转]概率DP总结 by kuangbin
概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...
- 动态规划之经典数学期望和概率DP
起因:在一场训练赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有\(X,Y,Z\)块钱 ...
- 概率dp学习
预备知识 一.期望的数学定义 如果X 是一个离散的随机变量,输出值为 x1, x2, ..., 和输出值相应的概率为p1, p2, ... (概率和为 1), 那么期望值为E(x)=x1p1+x2p2 ...
- Codeforces 28C [概率DP]
/* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队 ...
- HDU 4405 Aeroplane chess (概率DP)
题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i 这个位置到达 n ...
- POJ 2096 Collecting Bugs (概率DP)
题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...
- POJ 2151 Check the difficulty of problems (概率DP)
题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...
- 概率DP light oj 1030
t组数据 n块黄金 到这里就捡起来 出发点1 到n结束 点+位置>n 重掷一次 dp[i] 代表到这里的概率 dp[i]=(dp[i-1]+dp[i-2]... )/6 如果满6个的话 否则 ...
- hdu 4050 2011北京赛区网络赛K 概率dp ***
题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到 ...
随机推荐
- lucene-SpanNotQuery和SpanOrQuery交迭与全局跨度
1.在匹配结果中排除相互交迭的跨度 SpanNotQuery构造函数的第一个参数表示要包含的跨度对象,第二个参数表示要排除的跨度对象. 1) SpanNearQuery quick_fox=new S ...
- java 面向抽象编程的思想
SIM.java public abstract class SIM { public abstract void setNumber(String n); public abstract Strin ...
- Django -- Views and URLconf
1 创建工程 django-admin startproject mysite && cd mysite 2 创建应用 python manage.py startapp blog 3 ...
- 转:浏览器与WEB服务器工作过程举例
用户通过“浏览器”访问因特网上的WEB服务器,浏览器和服务器之间的信息交换使用超文本传输协议(HTTP--HyperText Transfer Protocol). 例:用户访问东南大学主页 Http ...
- C4.5算法总结
C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C4.5的目标是通过学习, ...
- robot_framewok自动化测试
robot_framewok自动化测试 http://wenku.baidu.com/view/691abcaa4b73f242336c5fec.html 接口自动化测试框架设计 http://wen ...
- VC与ADO数据库操作
VC与ADO数据库操作 学研部的同志们,大家好! 想开一次学习会,实习时间冲突了,只好把文档发给大家看了.重点推荐李振龙的BMP读图教程! 尤其是大三GIS班的同志,注意了,可能实习用得上的! 一.A ...
- PHP递归算法的一个实例 帮助理解
递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲 ...
- 未能读取并闩锁页 (1:xxxxx)(用闩锁类型 SH)
设置数据库为紧急模式 停掉SQL Server服务: 把应用数据库的数据文件XXX_Data.mdf移走: 重新建立一个同名的数据库XXX: 停掉SQL服务: 把原来的数据文件再覆盖回来: 运行以下语 ...
- 从零深入 tomcat
1.tomcat的安装使用 tomcat是实现了J2EE标准的最简单轻巧的WEB服务器,所以使用tomcat必须安装JDK咯! ① 安装JDK并设置环境变量: ②设置tomcat的环境变量: 这两小步 ...