题目大意:

一个人在n长的路径上走到底再往回,走i步停下来的概率为Pi , 求从起点开始到自己所希望的终点所走步数的数学期望

因为每个位置都跟后m个位置的数学期望有关

E[i] = sigma((E[i+j]+j)*P[j])

我们需要将模型转化一下,本来路径为012345这样,因为来回走,我们多定义n-2个点就是 0123454321然后利用取模就可以不断找到下一组相关的m个点

列出多元方程组,利用高斯消元解决问题

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N = ;
#define eps 1e-8 double a[N][N] , x[N] , p[N] , sum;
int n,m,st,en,dire;
int id[N] , cnt;//cnt记录需要求解的未知数个数 queue<int> q;
bool bfs()
{
memset(id , - , sizeof(id));
cnt = ;
id[st] = cnt++;
q.push(st);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i= ; i<=m ; i++){
int v = (u+i)%n;
if(fabs(p[i])<eps || id[v]>=) continue;
id[v] = cnt++;
q.push(v);
}
}
return id[en]>= || id[n-en]>=; //终点有两个
}
//建立多元方程组
void build()
{
memset(a , , sizeof(a));
for(int i= ; i<n ; i++){
if(id[i] < ) continue;
int u=id[i];
a[u][u] = ;
if(u == id[en] || u == id[n-en]) {a[u][cnt]=;continue;}
for(int j= ; j<=m ; j++){
int v = (i+j)%n;
if(id[v]<) continue;
v = id[v];
a[u][v] -= p[j];
a[u][cnt] += p[j]*j;
}
}
/* for(int i=0 ; i<n ; i++)
{
for(int j=0 ; j<=n ; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}*/
} int gauss(int n)
{
int i,j,k;
for(i=,j= ; i<n&&j<n ; j++){
for(k=i ; k<n ; k++)
if(fabs(a[k][j])>=eps) break;
if(k<n){
if(i!=k){
for(int r=j ; r<=n ; r++)
swap(a[i][r],a[k][r]);
}
double tt=1.0/a[i][j];
for(int r=j ; r<=n ; r++)
a[i][r]*=tt;
for(int r= ; r<n ; r++) //这从 0~n ,整个2重循环相当于消去和回代同时操作
if(r!=i){
for(int t=n ; t>=j ; t--) //一定是递减序
a[r][t] -= a[r][j]*a[i][t];
}
i++;
}
}
//检查是否还有未满足的方程式
for(int r=i ; r<n ; r++)
if(fabs(a[r][n])>=eps)
return ;
return ;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in" , "r" , stdin);
#endif // ONLINE_JUDGE
int T;
scanf("%d" , &T);
while(T--)
{
scanf("%d%d%d%d%d" , &n , &m , &en , &st , &dire);
n = *n-;
sum = ;
for(int i= ; i<=m ; i++){
int v;
scanf("%d" , &v);
p[i] = v*1.0/100.0;
sum += p[i]*i;
}
if(st == en){
puts("0.00");
continue;
}
if(dire>) st = n-st;
if(!bfs()){
puts("Impossible !");
continue;
}
build();
if(!gauss(cnt)) {
puts("Impossible !");
continue;
}
printf("%.2f\n" , a[][cnt]); }
return ;
}

HDU 4418 高斯消元解决概率期望的更多相关文章

  1. [置顶] hdu 4418 高斯消元解方程求期望

    题意:  一个人在一条线段来回走(遇到线段端点就转变方向),现在他从起点出发,并有一个初始方向, 每次都可以走1, 2, 3 ..... m步,都有对应着一个概率.问你他走到终点的概率 思路: 方向问 ...

  2. hdu 4418 高斯消元求期望

    Time travel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 【BZOJ3143】游走(高斯消元,数学期望)

    [BZOJ3143]游走(高斯消元,数学期望) 题面 BZOJ 题解 首先,概率不会直接算... 所以来一个逼近法算概率 这样就可以求出每一条边的概率 随着走的步数的增多,答案越接近 (我卡到\(50 ...

  4. HDU 2827 高斯消元

    模板的高斯消元.... /** @Date : 2017-09-26 18:05:03 * @FileName: HDU 2827 高斯消元.cpp * @Platform: Windows * @A ...

  5. First Knight UVALive - 4297(优化高斯消元解概率dp)

    题意: 一个矩形区域被分成 m*n 个单元编号为 (1, 1)至 (m, n),左上为 (1, 1),右下为(m, n).给出P(k)i,j,其中 1 ≤ i ≤ m,1 ≤ j ≤ n,1 ≤ k ...

  6. 【BZOJ 3640】JC的小苹果 (高斯消元,概率DP)

    JC的小苹果 Submit: 432  Solved: 159 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话 ...

  7. BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)

    1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...

  8. hdu 3915 高斯消元

    http://acm.hdu.edu.cn/showproblem.php?pid=3915 这道题目是和博弈论挂钩的高斯消元.本题涉及的博弈是nim博弈,结论是:当先手处于奇异局势时(几堆石子数相互 ...

  9. HDU 3359 高斯消元模板题,

    http://acm.hdu.edu.cn/showproblem.php?pid=3359 题目的意思是,由矩阵A生成矩阵B的方法是: 以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 ...

随机推荐

  1. ES--在windows上快速安装

    环境准备 java环境部署: Java下载路径:http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a ...

  2. pscp多线程传输文件

    前面说过pscp不支持多线程,所以在此特地实现了一个 程序分三个部分: 1.初始化各种参数,涉及getopt函数的使用 2.重新定义scp,实现传递IP然后远程拷贝 3.启动多线程调用scp,涉及多线 ...

  3. hash 【模板】

    hash 功能: hash一般用于快速判断两个或多个字符串是否匹配. 实现 :    想一想,如果比较两个数子的话是很方便的很快,那么我们把整个字符串看成一个大数.  它是base进制的len位数.但 ...

  4. SecureCRT中vi或vim编辑器显示中文乱码问题

    vi ~/.vimrc  //新建文件 syntax on set showmode set autowrite set number set encoding=utf-8 fileencodings ...

  5. AJPFX总结方法里的属性

    嵌套循环:循环里套循环 假设外循环的循环次数是m次,内循环的循环次数是n次,那么内层循环的循环次数需要 m * n次.   Eg:利用for循环语句的嵌套打印出乘法口诀表   class break1 ...

  6. (转)IC设计完整流程及工具

    IC的设计过程可分为两个部分,分别为:前端设计(也称逻辑设计)和后端设计(也称物理设计),这两个部分并没有统一严格的界限,凡涉及到与工艺有关的设计可称为后端设计. 前端设计的主要流程: 1.规格制定 ...

  7. mac下安装nodejs

    下载 https://nodejs.org/en/ 安装 一步步继续就ok 验证 npm -v node -v Done!

  8. findFile的用法

    ===============================================   @echo off   echo **No Options:   for /f %%a in (&q ...

  9. SAP云平台架构概述

    在我们开始SAP云平台的架构之旅之前,让我们先看看SAP已经发布的一些其他云产品.这些云产品方案可以分为公有云和私有云两种. SAP公有云解决方案见下图最右侧,比较著名的有SAP SuccessFac ...

  10. 在2015年 开发一个 Web App 必须了解的那些事

    在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...