首先来个期望的论文,讲的非常好,里面也提到了使用线性方程组求解,尤其适用于有向图的期望问题。

算法合集之《浅析竞赛中一类数学期望问题的解决方法》

http://www.lightoj.com/volume_showproblem.php?problem=1151

题意:有个1~100个格子的地图,每次投骰子,点数1~6,问到达第100格所需的投骰子次数期望值是多少,注意如果最后走的点数超出了地图,不算完成。地图中有传送门,a b表示从第a格可以到b格。

思路:首先可以想到DP的转移有两种,如果i是传送门那么\(dp[i] = dp[tp[i]] \),如果不是,则\(dp[i]=\frac{6+\sum_{j = 1}^{6}{dp[i+j]}}{6}\) 由于传送门可能成环,那么路径有无数条,所以需要转换成方程\(6 * dp[i] - \sum_{j = 1}^{6}{dp[i+j]} = 6 \)  ,\(dp[i] - dp[tp[i]] = 0 \)

再用高斯消元求解。

高斯消元的模板网上找的..

/** @Date    : 2016-12-03-20.06
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version :
*/ #include<bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+2000;
const double eps = 1e-12; int tp[110];
double mat[110][110];
double x[110];
int free_x[110]; int Gauss(int equ, int var)
{
int k;
int max_r;
int col;
int ta, tb;
int LCM;
int temp;
int free_idx, free_num;
memset(free_x, 1, sizeof(free_x));
MMF(x); for(k = col = 0; k < equ && col < var; k++, col++)
{
max_r = k;
for(int i = k + 1; i < equ; i++)
if(fabs(mat[i][col]) - fabs(mat[max_r][col]) > eps)
max_r = i; if(max_r != k)
for(int j = k; j < var + 1; j++)
swap(mat[max_r][j], mat[k][j]); if(fabs(mat[k][col]) <= eps)
{
k--;
continue;
}
for(int i = k + 1; i < equ; i++)
{
if(fabs(mat[i][col]) <= eps)
continue;
double tt = mat[i][col] / mat[k][col];
for(int j = col; j < var + 1; j++)
mat[i][j] -= mat[k][j] * tt;
}
}
//no solution
for(int i = k; i <= equ; i++)
if(fabs(mat[i][var]) > eps)
return -1;
//multiple
if(k < var)
{
for(int i = k - 1; i >= 0; i--)
{
free_num = 0;
for(int j = 0; j < var; j++)
if(fabs(mat[i][j]) > eps && free_x[j])
{
free_num++;
free_idx = j;
}
if(free_num > 1)//multiple var, and can't solve
continue; double tt = mat[i][var];
for(int j = 0; j < var; j++)
if(j != free_num && fabs(mat[i][j]) > eps)
tt -= mat[i][j] * x[j]; free_x[free_idx] = 0;
x[free_idx] = tt / mat[i][free_idx];
}
return var - k;
}
//only one
for(int i = var - 1; i >= 0; i--)
{
double tt = mat[i][var];
for(int j = i + 1; j < var; j++)
if(fabs(mat[i][j]) > eps)
tt -= mat[i][j] * x[j];
x[i] = tt / mat[i][i];
}
return 1;
} int main()
{
int T;
int cnt = 0;
cin >> T;
while(T--)
{
int n;
scanf("%d", &n);
for(int i = 1; i <= 100; i++)
{
tp[i] = i;
} int a, b;
for(int i = 1; i <= n; i++)
scanf("%d%d", &a, &b), tp[a] = b; MMF(mat);
mat[100][100] = 1;
mat[100][101] = 0;
for(int i = 1; i < 100; i++)
{
if(tp[i] != i)
{
mat[i][i] = 1;
mat[i][tp[i]] = -1;
mat[i][101] = 0;
}
else
{
int k = 0;
for(int j = 1; j <= 6; j++)
if(j + i <= 100)
{
k++;
mat[i][i + j] = -1;
}
mat[i][i] = k;
mat[i][101] = 6;
}
}
Gauss(101, 101);
printf("Case %d: %.10lf\n", ++cnt, x[1]);
}
return 0;
}

LightOJ 1151 - Snakes and Ladders 高斯消元+概率DP的更多相关文章

  1. light oj 1151 - Snakes and Ladders 高斯消元+概率DP

    思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...

  2. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...

  3. BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]

    2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...

  4. Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)

    题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...

  5. [luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】

    看到题面的那一刻,我是绝望的ORZ 图论加概率期望加好像不沾边的高斯消元???我人直接傻掉 还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程.. Description 奶牛们建 ...

  6. UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP

    题目来源:UVa 10828 Back to Kernighan-Ritchie 题意:从1開始 每次等概率从一个点到和他相邻的点 有向 走到不能走停止 求停止时每一个点的期望 思路:写出方程消元 方 ...

  7. bzoj 2337 高斯消元+概率DP

    题目大意: 每条路径上有一个距离值,从1走到N可以得到一个所有经过路径的异或和,求这个异或和的数学期望 这道题直接去求数学期望的DP会导致很难列出多元方程组 我们可以考虑每一个二进制位从1走到N的平均 ...

  8. LightOJ 1151 Snakes and Ladders(概率DP + 高斯消元)

    题意:1~100的格子,有n个传送阵,一个把进入i的人瞬间传送到tp[i](可能传送到前面,也可能是后面),已知传送阵终点不会有另一个传送阵,1和100都不会有传送阵.每次走都需要掷一次骰子(1~6且 ...

  9. LightOJ 1151 Snakes and Ladders 期望dp+高斯消元

    题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定   而且 ...

随机推荐

  1. Agri-Net(最小生成树)

    Description Farmer John has been elected mayor of his town! One of his campaign promises was to brin ...

  2. Notes of the scrum meeting(12.11)

    meeting time:19:30~20:30p.m.,December 11th,2013 meeting place:3号公寓一层 attendees: 顾育豪                  ...

  3. php中array_map和array_walk的使用对比

    一.array_map() 1.array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,若函数作用后无返回值,则对应的新值数组中为空. 2.回调 ...

  4. oracle数据库之游标的使用

    一.游标概念 为了处理 SQL 语句,ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的信息,其中包括要处理的行的数目,一个指向语句被分析以后的表示形式的指针以及查 ...

  5. Mybatis实现

    简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...

  6. Java中I/O流之Print流

    Java 中的 print 流: print 流用于做输出将会非常的方便,并且具有以下特点: 1. printWriter.printStream 都属于输出流,分别针对字符,字节. 2. print ...

  7. 面试中常用排序算法的python实现和性能分析

    这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...

  8. 数据库时间内接受的是lang类型的时间 分为三种字段 第一种只存日期 第二种存日期+时间 第三种时间戳

    数据库时间内接受的是lang类型的时间 分为三种字段 第一种只存日期 第二种存日期+时间 第三种时间戳

  9. bzoj3998-弦论

    给定一个长度为\(n(n\le 5\times 10^5)\)的字符串,求它的第\(k\)小字串.有两种模式: \(Type=0\),不同位置的相同字串只算一个 \(Type=1\),不同位置相同字串 ...

  10. 【bzoj3524】[Poi2014]Couriers 主席树

    题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...