题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4418

  题意:简单来说就是给你1个环(n - 1 , n - 2 …… 0 ,1 , 2 , 3 …… n - 2)。你可以走1 - m步每步的概率是给定的。。保证sum(pk)(1 <= k <= m)的和是100,问你从x开始给你一个初始方向走到y的期望步数是多少。d = 0 代表从0 ->n - 1 ,d = 1代表从n - 1 -> 0。

  由于这里同一个点每次转移的方向是不一样的,因此要进行拆点,即0, 1, 2, 3 -> 0, 1, 2, 3, 4, 5,4和5分别表示2和1这个点的相反的方向。然后做一遍BFS,看是否能到达Y点,如果能的话,列出期望方程:E[i]=Σ( (E[j]+k)*p[k] ),然后高斯消元,这里高斯方程可以把不能到达的点都去掉,也可以把它的期望设为OO(无穷大),因为这里精度只有0.01...

 //STATUS:C++_AC_312MS_800KB
#include <functional>
#include <algorithm>
#include <iostream>
//#include <ext/rope>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
//using namespace __gnu_cxx;
//define
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1.0)
//typedef
typedef __int64 LL;
typedef unsigned __int64 ULL;
//const
const int N=;
const int INF=0x3f3f3f3f;
const LL MOD=,STA=;
const LL LNF=1LL<<;
const double EPS=1e-;
const double OO=1e9;
const int dx[]={-,,,};
const int dy[]={,,,-};
const int day[]={,,,,,,,,,,,,};
//Daily Use ...
inline int sign(double x){return (x>EPS)-(x<-EPS);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
//End /* gauss_elimination O(n^3)
n个方程n个变元
要求系数矩阵可逆
A[][]是增广矩阵,即A[i][n]是第i个方程右边的常数bi
运行结束后A[i][n]是第i个未知数的值 */
int vis[N];
double p[N];
int T,n,m,Y,X,D,up; double A[N][N]; void gauss(int n)
{
int i,j,k,r;
for(i=;i<n;i++){
//选一行与r与第i行交换,提高数据值的稳定性
r=i;
for(j=i+;j<n;j++)
if(fabs(A[j][i]) > fabs(A[r][i]))r=j;
if(r!=i)for(j=;j<=n;j++)swap(A[r][j],A[i][j]);
//i行与i+1~n行消元
/* for(k=i+1;k<n;k++){ //从小到大消元,中间变量f会有损失
double f=A[k][i]/A[i][i];
for(j=i;j<=n;j++)A[k][j]-=f*A[i][j];
}*/
for(j=n;j>=i;j--){ //从大到小消元,精度更高
for(k=i+;k<n;k++)
A[k][j]-=A[k][i]/A[i][i]*A[i][j];
}
}
//回代过程
for(i=n-;i>=;i--){
for(j=i+;j<n;j++)
A[i][n]-=A[j][n]*A[i][j];
A[i][n]/=A[i][i];
}
} int bfs()
{
int i,u,v;
queue<int> q;
mem(vis,);
q.push(X);
vis[X]=;
while(!q.empty())
{
u=q.front();q.pop();
if(u==Y || u==up-Y)A[u][up]=;
A[u][u]=;
for(i=;i<=m;i++){
v=((u+i*D)%up+up)%up;
if(u!=Y && u!=up-Y)A[u][v]-=p[i];
if(sign(p[i]) && !vis[v]){
vis[v]=;
q.push(v);
}
}
}
for(i=;i<up;i++){
if(!vis[i])A[i][i]=,A[i][up]=OO;
}
return vis[Y] || vis[up-Y];
} int main(){
// freopen("in.txt","r",stdin);
int i,j;
double t;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d",&n,&m,&Y,&X,&D);
if(!X || !D)D=;
else D=-;
t=;
for(i=;i<=m;i++){
scanf("%lf",&p[i]);
p[i]/=;
t+=i*p[i];
}
if(X==Y){
printf("0.00\n");
continue;
}
up=n+n-;
mem(A,);
for(i=;i<up;i++)A[i][up]=t;
if(bfs()){
gauss(up);
printf("%.2lf\n",A[X][up]);
}
else printf("Impossible !\n");
}
return ;
}

HDU-4418 Time travel 概率DP,高斯消元的更多相关文章

  1. 2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元

    http://acm.hdu.edu.cn/showproblem.php?pid=5955 题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少 题解:先建成ac ...

  2. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  3. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

  4. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  5. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

  6. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  7. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  8. hdu 4418 Time travel 概率DP

    高斯消元求期望!! 将n时间点构成2*(n-1)的环,每一点的期望值为dp[i]=dp[i+1]*p1+dp[i+2]*p2+……+dp[i+m]*pm+1. 这样就可以多个方程,利用高斯消元求解. ...

  9. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

随机推荐

  1. 从零开始运维之旅:如何监控你的 Windows?

    小弟乃刚刚踏入运维圈的资深小白一枚,正所谓完事开头难,公司里怕我把生产系统搞坏就让我先在测试环境上先练练手.巧的是测试环境又是我熟悉的 Windows 环境,心中窃喜啊.但问题随之而来,运维从何下手呢 ...

  2. ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置

    原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...

  3. Apache James搭建内网邮件服务器

    Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...

  4. 再分析 返回值加引用&,const

    本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...

  5. mysql concat和group_concat

    mysql concat(str1,str2...)连接两个字符串,(数字也是可以的,会转成字符串) MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL mys ...

  6. android开发无障碍app

    最近做一些为盲人提供服务的APP,还是挺有感触的,感谢手机和互联网的普及,他们的生活比以前丰富了很多. 通过读屏软件,盲人可以操作手机,上网浏览信息.读屏软件的工作原理很简单,就是读出屏幕上按钮.文本 ...

  7. git rev-list

    git-rev-list - Lists commit objects in reverse chronological order 按照时间顺序倒序排列的commit Update: If all ...

  8. Ubuntu设置中文

    Ubuntu设置中文:需要联网下载中文包,不然无法设置中文系统. 进去系统后再右上角有个齿轮图标点击,找到系统设置(System Settings)点击弹出一个界面,找到Language Suppor ...

  9. poj2352Stars

    http://poj.org/problem?id=2352 二维逆序数 按一个数排序 转化为1维的 之前用树状数组写过 这次用线段树敲了下 #include <iostream> #in ...

  10. LeeCode Algorithm #3 Longest Substring Without Repeating Characters

    一开始以为是不连续的,其实要求子串是连续的.想法:two-pointer O(n)时间,再借助256大小的int数组.两个下标i,j(i<=j).对于i=0,找到最右侧的字符不重复的下标的后一位 ...