论文链接:  http://wenku.baidu.com/link?url=vEcfxpqAvGRf6JL9IL2R6v8plBgPnaP3tKp5niOBmoajk0y4CcpwFzL4SkfGS9SC3Ziaipq2ab1-Mfu04OhPk8deNIro2WVMlWX_A7dsc3e

  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初探的更多相关文章

  1. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

  2. 动态规划之经典数学期望和概率DP

    起因:在一场训练赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有\(X,Y,Z\)块钱 ...

  3. 概率dp学习

    预备知识 一.期望的数学定义 如果X 是一个离散的随机变量,输出值为 x1, x2, ..., 和输出值相应的概率为p1, p2, ... (概率和为 1), 那么期望值为E(x)=x1p1+x2p2 ...

  4. Codeforces 28C [概率DP]

    /* 大连热身D题 题意: 有n个人,m个浴室每个浴室有ai个喷头,每个人等概率得选择一个浴室. 每个浴室的人都在喷头前边排队,而且每个浴室内保证大家都尽可能均匀得在喷头后边排队. 求所有浴室中最长队 ...

  5. HDU 4405 Aeroplane chess (概率DP)

    题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i  这个位置到达 n ...

  6. POJ 2096 Collecting Bugs (概率DP)

    题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...

  7. POJ 2151 Check the difficulty of problems (概率DP)

    题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...

  8. 概率DP light oj 1030

    t组数据 n块黄金 到这里就捡起来 出发点1 到n结束  点+位置>n 重掷一次 dp[i] 代表到这里的概率 dp[i]=(dp[i-1]+dp[i-2]... )/6  如果满6个的话 否则 ...

  9. hdu 4050 2011北京赛区网络赛K 概率dp ***

    题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到 ...

随机推荐

  1. hdu 2647 Reward(拓扑排序,反着来)

    Reward Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  2. Linux学习 -- Shell编程 -- 字符截取命令

    cut字段提取命令 cut [选项] 文件名 -f 列号: -d 分隔符: 局限性:空格为分隔符时不适用 printf命令 printf '输出类型输出格式' 输出内容 %s, %i, %f \a, ...

  3. android 多个shortCut快捷方式实现以及对58同城快捷方式的实现思路的研究

    这几天,项目中有个新需求,需要按照模块添加不同的快捷方式到桌面上,从而方便用户的使用.特意进行了研究并分析了下58上面桌面快捷方式的实现. 首先多个shortcut的实现: <activity ...

  4. springMVC下载文件前修改文件名字

    很多时候,为了方便,下载文件其实就直接写了一个文件在服务器上面的路径,然后直接点击一个这个地址,浏览器就自然而然的开始下载了. 但是这次项目需要在文件下载之前修改文件的名字,也就是说,服务器上文件的名 ...

  5. STL笔记之【map之移除元素】

    //---------------------------------------------------------// 移除map中满足条件的元素//----------------------- ...

  6. CSS样式覆盖规则

    有一下问题, 想让下面的border生效 ,#比. 优先级高, #navigator { height: 100%; width: 200; position: absolute; left: 0; ...

  7. Centos yum 安装mysql报错 No package mysql-server available.

    这是因为大多数mysql-*的资源名称被mariadb-*重命名了 所以换成 yum install mariadb-server 就可以了 PS[摘自网络] MariaDB不仅仅是Mysql的一个替 ...

  8. Changing a remote's URL

    原文: https://help.github.com/articles/changing-a-remote-s-url/ Changing a remote's URL MAC WINDOWS LI ...

  9. One Bomb

    One Bomb time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  10. ListView下拉刷新、上拉载入更多之封装改进

    在Android中ListView下拉刷新.上拉载入更多示例一文中,Maxwin兄给出的控件比较强大,前面有详细介绍,但是有个不足就是,里面使用了一些资源文件,包括图片,String,layout,这 ...