HDU 4418 高斯消元解决概率期望

  题目大意:

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

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

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

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

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

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <cmath>
  6 #include <queue>
  7 using namespace std;
  8 const int N = 205;
  9 #define eps 1e-8
 10
 11 double a[N][N] , x[N] , p[N] , sum;
 12 int n,m,st,en,dire;
 13 int id[N] , cnt;//cnt记录需要求解的未知数个数
 14
 15 queue<int> q;
 16 bool bfs()
 17 {
 18     memset(id , -1 , sizeof(id));
 19     cnt = 0;
 20     id[st] = cnt++;
 21     q.push(st);
 22     while(!q.empty())
 23     {
 24         int u=q.front();
 25         q.pop();
 26         for(int i=1 ; i<=m ; i++){
 27             int v = (u+i)%n;
 28             if(fabs(p[i])<eps || id[v]>=0) continue;
 29             id[v] = cnt++;
 30             q.push(v);
 31         }
 32     }
 33     return id[en]>=0 || id[n-en]>=0; //终点有两个
 34 }
 35 //建立多元方程组
 36 void build()
 37 {
 38     memset(a , 0 , sizeof(a));
 39     for(int i=0 ; i<n ; i++){
 40         if(id[i] < 0) continue;
 41         int u=id[i];
 42         a[u][u] = 1;
 43         if(u == id[en] || u == id[n-en]) {a[u][cnt]=0;continue;}
 44         for(int j=1 ; j<=m ; j++){
 45             int v =  (i+j)%n;
 46             if(id[v]<0) continue;
 47             v = id[v];
 48             a[u][v] -= p[j];
 49             a[u][cnt] += p[j]*j;
 50         }
 51     }
 52    /* for(int i=0 ; i<n ; i++)
 53         {
 54             for(int j=0 ; j<=n ; j++)
 55                 cout<<a[i][j]<<" ";
 56             cout<<endl;
 57         }*/
 58 }
 59
 60 int gauss(int n)
 61 {
 62     int i,j,k;
 63     for(i=0,j=0 ; i<n&&j<n ; j++){
 64         for(k=i ; k<n ; k++)
 65             if(fabs(a[k][j])>=eps) break;
 66         if(k<n){
 67             if(i!=k){
 68                 for(int r=j ; r<=n ; r++)
 69                     swap(a[i][r],a[k][r]);
 70             }
 71             double tt=1.0/a[i][j];
 72             for(int r=j ; r<=n ; r++)
 73                 a[i][r]*=tt;
 74             for(int r=0 ; r<n ; r++) //这从 0~n ,整个2重循环相当于消去和回代同时操作
 75                 if(r!=i){
 76                     for(int t=n ; t>=j ; t--) //一定是递减序
 77                         a[r][t] -= a[r][j]*a[i][t];
 78                 }
 79             i++;
 80         }
 81     }
 82     //检查是否还有未满足的方程式
 83     for(int r=i ; r<n ; r++)
 84         if(fabs(a[r][n])>=eps)
 85             return 0;
 86     return 1;
 87 }
 88
 89 int main()
 90 {
 91     #ifndef ONLINE_JUDGE
 92         freopen("a.in" , "r" , stdin);
 93     #endif // ONLINE_JUDGE
 94     int T;
 95     scanf("%d" , &T);
 96     while(T--)
 97     {
 98         scanf("%d%d%d%d%d" , &n , &m , &en , &st , &dire);
 99         n = 2*n-2;
100         sum = 0;
101         for(int i=1 ; i<=m ; i++){
102             int v;
103             scanf("%d" , &v);
104             p[i] = v*1.0/100.0;
105             sum += p[i]*i;
106         }
107         if(st == en){
108             puts("0.00");
109             continue;
110         }
111         if(dire>0) st = n-st;
112         if(!bfs()){
113             puts("Impossible !");
114             continue;
115         }
116         build();
117         if(!gauss(cnt)) {
118             puts("Impossible !");
119             continue;
120         }
121         printf("%.2f\n" , a[0][cnt]);
122
123     }
124     return 0;
125 }
时间: 2024-08-08 09:33:46

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

hdu 4418 高斯消元求期望

Time travel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1480    Accepted Submission(s): 327 Problem Description Agent K is one of the greatest agents in a secret organization called Men in B

hdu 2262 高斯消元求期望

Where is the canteen Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1070    Accepted Submission(s): 298 Problem Description After a long drastic struggle with himself, LL decide to go for some

【复习】高斯消元解图上期望概率

复习了一下高斯消元解图上期望概率,笔记的话,就直接去看SengXian的blog吧.BZOJ 1444 - [Jsoi2009]有趣的游戏见https://blog.sengxian.com/solutions/bzoj-1444 #include <cstdio> #include <cstring> #include <algorithm> const int N=11; char s[N*2]; int n,m,l,cnt,trans[N*N][N],id[N*N

hdu 3915 高斯消元

Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 724    Accepted Submission(s): 285 Problem Description Mr.Frost is a child who is too simple, sometimes naive, always plays some simple but i

uva 10828 高斯消元求数学期望

Back to Kernighan-RitchieInput: Standard Input Output: Standard Output You must have heard the name of Kernighan and Ritchie, the authors of The C Programming Language. While coding in C, we use different control statements and loops, such as, if-the

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 ≤ 4,表示了 (i, j)到 (i+1, j),(i, j+1),(i-1, j),(i, j-1)的概率.一个骑士在 (1, 1),按照给定概率走,每步都于之前无关,问到达 (m, n)的期望步数. 解析: 很容易想到 然后移项  写出行列式 图截自大佬题解 矩阵中 概率为负 1为正 是因为移项

HDU 3359 高斯消元模板题,

http://acm.hdu.edu.cn/showproblem.php?pid=3359 题目的意思是,由矩阵A生成矩阵B的方法是: 以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 / 个数,就是矩阵B的b[i][j] 现在给出B,要求A 那么我们设A矩阵为a[1][1], a[1][2], a[1][3]..... 那么对于每一个b[i][j]我们有b[i][j] = (a[1][1] + a[1][2] + ... + ) / cnt 所以这样可以建议一条方程,然后guas

关于高斯消元解决xor问题的总结

我觉得xor这东西特别神奇,最神奇的就是这个性质了 A xor B xor B=A 这样就根本不用在意重复之类的问题了 关于xor的问题大家可以去膜拜莫队的<高斯消元解XOR方程组>,里面写的很详细 我来扯两道bzoj上的例题好了 bzoj2115,求1-N最长xor路径,根据那个神奇的性质,我们先随便找一条1-n的路径作为标准路径 任意一条1-N的路径都等价于标准路径和某些环的xor 怎么找环?很简单,bfs下去,设d[x]表示1到x的一条路径xor值,如果到一条边x-->y时y已经访

hdu 5088 高斯消元n堆石子取k堆石子使剩余异或值为0

http://acm.hdu.edu.cn/showproblem.php?pid=5088 求能否去掉几堆石子使得nim游戏胜利 我们可以把题目转化成求n堆石子中的k堆石子数异或为0的情况数.使用x1---xn表示最终第i堆石子到底取不取(1取,0不取),将每堆石子数画成2进制的形式,列成31个方程来求自由变元数,最后由于自由变元能取1.0两种状态,所以自由变元数多于0即可输出Yes. 注意有40+个方程,因为A[I]<=1e12.... #include <cstdio> #incl