概率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:表示不能到 ...
随机推荐
- 正确使用String,StringBuffer,StringBuilder
很多时候在实际中,我们很常用的就是字符串String. 对于它,网上已经说的很多了. 我就说一点是特别重要的需要记住的,String赋值之后它就是不能被改变的. 也就是这一点,导致了String在操作 ...
- springmvc传递json数据到前台显示
需要两个包 jackson-core-asl, jackson-mapper-asl controller @RequestMapping(value="/findEduList" ...
- hibernate事务并发问题(脏读,不可重复读,幻读)
脏读 dirty read: 读了别的事务没有提交的事务, 可能回滚, 数据可能不对. 不可重复读 non repeatable read: 同一个事务里前后读出来的数据不一样, 被另一个事务影响 ...
- XML 从基础到精通
1.简介 XML(可扩展标记语言)语言是一种数据交换标准,用于存储数据:关键词是标记: XML具有以下优点: (1) 方便的穿过防火墙,在不同的操作系统之间通信,跨语言,跨平台.数据共享非常方便.(J ...
- android脚步---将layout和其输出一起保存成图片
public void convertViewToBitmap(View view) { //View view = getLayoutInflater().inflate(R.layout.test ...
- backBarButtonItem无效
控制器A push-> 控制器B, 我设置了B的backBarButtonItem为“返回”,发现无效... 原因: 应该在控制器A中设置backBarButtonItem,这样在push B之 ...
- JS读RSS
<html> <head> <title>javascript读取RSS数据</title> <META content="t ...
- 转:Web 测试的创作与调试技术
摘要:学习有关 Visual Studio 2005 Web 测试的更多知识,包括 Web 测试引擎和记录器如何工作,以及如何创建有效的 Web 测试. 本页内容 读者 简介 记录一个 Web 测试 ...
- 配置glance使用NFS后端
首先先使用“glance image-delete”命令删除所有镜像,释放磁盘空间. 停止glance服务:service openstack-glance-api stopservice opens ...
- POJ 3683 Priest John's Busiest Day
2-SAT简单题,判断一下两个开区间是否相交 #include<cstdio> #include<cstring> #include<cmath> #include ...