概率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:表示不能到 ...
随机推荐
- hdu 2647 Reward(拓扑排序,反着来)
Reward Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- Linux学习 -- Shell编程 -- 字符截取命令
cut字段提取命令 cut [选项] 文件名 -f 列号: -d 分隔符: 局限性:空格为分隔符时不适用 printf命令 printf '输出类型输出格式' 输出内容 %s, %i, %f \a, ...
- android 多个shortCut快捷方式实现以及对58同城快捷方式的实现思路的研究
这几天,项目中有个新需求,需要按照模块添加不同的快捷方式到桌面上,从而方便用户的使用.特意进行了研究并分析了下58上面桌面快捷方式的实现. 首先多个shortcut的实现: <activity ...
- springMVC下载文件前修改文件名字
很多时候,为了方便,下载文件其实就直接写了一个文件在服务器上面的路径,然后直接点击一个这个地址,浏览器就自然而然的开始下载了. 但是这次项目需要在文件下载之前修改文件的名字,也就是说,服务器上文件的名 ...
- STL笔记之【map之移除元素】
//---------------------------------------------------------// 移除map中满足条件的元素//----------------------- ...
- CSS样式覆盖规则
有一下问题, 想让下面的border生效 ,#比. 优先级高, #navigator { height: 100%; width: 200; position: absolute; left: 0; ...
- Centos yum 安装mysql报错 No package mysql-server available.
这是因为大多数mysql-*的资源名称被mariadb-*重命名了 所以换成 yum install mariadb-server 就可以了 PS[摘自网络] MariaDB不仅仅是Mysql的一个替 ...
- Changing a remote's URL
原文: https://help.github.com/articles/changing-a-remote-s-url/ Changing a remote's URL MAC WINDOWS LI ...
- One Bomb
One Bomb time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- ListView下拉刷新、上拉载入更多之封装改进
在Android中ListView下拉刷新.上拉载入更多示例一文中,Maxwin兄给出的控件比较强大,前面有详细介绍,但是有个不足就是,里面使用了一些资源文件,包括图片,String,layout,这 ...