/*
初学概率期望问题
参考:http://blog.csdn.net/a601025382s/article/details/38047905
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 300
struct node {
double ma[N][N];
}a;
void gauss(int n) {
int i,j,k,r;
for(i=0;i<n;i++) {
r=i;
for(j=i+1;j<n;j++)
if(fabs(a.ma[j][i])>fabs(a.ma[r][i]))r=j;
if(r!=i) {
for(j=0;j<=n;j++)
swap(a.ma[r][j],a.ma[i][j]);
}
for(k=0;k<n;k++)
if(k!=i)
for(j=n;j>=i;j--)
a.ma[k][j]-=a.ma[k][i]/a.ma[i][i]*a.ma[i][j];
}
for(i=n-1;i>=0;i--) {
for(j=i+1;j<n;j++)
a.ma[i][n]-=a.ma[j][n]*a.ma[i][j];
a.ma[i][n]/=a.ma[i][i];
}
return ;
}
int main() {
double p;
int i,j;
while(scanf("%lf",&p)!=EOF) {
memset(a.ma,0,sizeof(a.ma));
for(i=0;i<20;i++) {
if(i==0) {
a.ma[i][i]=p;
a.ma[i][i+1]=-p;
}
else
if(i==1) {
a.ma[i][i]=1;
a.ma[i][i+1]=-p;
a.ma[i][0]=p-1;
}
else {
a.ma[i][i]=1;
if(i!=19)
a.ma[i][i+1]=-p;
a.ma[i][i-2]=p-1;
}
a.ma[i][20]=1;
}
gauss(20);
printf("%.6f\n",a.ma[0][20]*2-a.ma[19][20]);
}
return 0;}
hdu 4870 期望问题(高斯消元)
最新推荐文章于 2021-01-02 17:24:42 发布