LightOJ 1151 - Snakes and Ladders 高斯消元+概率DP
首先来个期望的论文,讲的非常好,里面也提到了使用线性方程组求解,尤其适用于有向图的期望问题。
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的更多相关文章
- light oj 1151 - Snakes and Ladders 高斯消元+概率DP
思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]
1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...
- BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]
2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...
- Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)
题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...
- [luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】
看到题面的那一刻,我是绝望的ORZ 图论加概率期望加好像不沾边的高斯消元???我人直接傻掉 还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程.. Description 奶牛们建 ...
- UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP
题目来源:UVa 10828 Back to Kernighan-Ritchie 题意:从1開始 每次等概率从一个点到和他相邻的点 有向 走到不能走停止 求停止时每一个点的期望 思路:写出方程消元 方 ...
- bzoj 2337 高斯消元+概率DP
题目大意: 每条路径上有一个距离值,从1走到N可以得到一个所有经过路径的异或和,求这个异或和的数学期望 这道题直接去求数学期望的DP会导致很难列出多元方程组 我们可以考虑每一个二进制位从1走到N的平均 ...
- LightOJ 1151 Snakes and Ladders(概率DP + 高斯消元)
题意:1~100的格子,有n个传送阵,一个把进入i的人瞬间传送到tp[i](可能传送到前面,也可能是后面),已知传送阵终点不会有另一个传送阵,1和100都不会有传送阵.每次走都需要掷一次骰子(1~6且 ...
- LightOJ 1151 Snakes and Ladders 期望dp+高斯消元
题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定 而且 ...
随机推荐
- python学习摘要(4)--列表简单处理
列表打印,访问列表元素 alist = [a,b,c,d,e] print(alist) friends_name = ['alex','bill','castle','dale'] c = 1 wh ...
- javaIO--字符流
java提供字符流对自否刘式文件进行数据读写操作.字符输入流类是Reader及其子类,输出流是Writer及其子类. 另外,上一篇javaIO写的是字节流,字节流方式也可以对以字符为基本类型的流式文件 ...
- 《剑指offer》---两个栈实现队列
本文算法使用python3实现 1.题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 时间限制:1s:空间限制:32768K 2.思路描述: ...
- ZigBee设备入网流程之关联方式
ZigBee设备入网流程 ZigBee设备入网有关联方式和直接方式两种,我所熟悉的是关联方式,这也是最常用的方式. 关联方式 step1 设备发出Beacon Request 设备会在预先设置的几个信 ...
- 【Docker 命令】- login 命令
docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub docker logout : 登出一个Docker镜像仓库,如果未指定镜像 ...
- WDCP V3.2面板安装且新增PHP多版本和免费Let's Encrypt SSL证书
文章原文:http://www.itbulu.com/wdcp-v32.html 我们很多网友对于WDCP面板应该算是比较熟悉的,老蒋在博客中也多次分享WDCP面板的相关教程内容,因为在平时帮助网友解 ...
- Sass的命令编译
[Sass]命令编译 命令编译是指使用你电脑中的命令终端,通过输入 Sass 指令来编译 Sass.这种编译方式是最直接也是最简单的一种方式.因为只需要在你的命令终端输入: 单文件编译: sass & ...
- 【bzoj2654】tree 二分+Kruscal
题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 输入 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行,每 ...
- Django错误 OperationalError: no such column: xxx
模型前后操作如下: 第一次迁移: class Snippet(models.Model): created = models.DateTimeField(auto_now_add=True) titl ...
- Elasticsearch 更新索引settings
1.更新索引设置:将副本减至0,修改索引分析器为ik_max_word和检索分词器为ik_smart 2.需要先将索引关闭,然后再PUT setings POST user/_close PUT us ...