[sdut]2623+[sdut]2878//四五届省赛中的两道数学期望

两道数学期望的题今天一起总结上来。

1.the number of steps(第四届省赛)

 1 #include <iostream>
 2 #include <string.h>
 3 #include <iomanip>
 4 using namespace std;
 5 double dp[100][100];
 6 int n;
 7 double a,b,c,d,e;
 8 
 9 int main()
10 {
11   while(cin>>n&&n)
12   {
13     cin>>a>>b>>c>>d>>e;
14     memset(dp,0,sizeof(dp));
15     dp[n][n]=0;//目的地
16     for(int i=n-1;i>=1;i--)
17       dp[n][i]+=1*(dp[n][i+1]+1);
18     for(int i=n-1;i>=1;i--)//行数
19     {
20       dp[i][i]+=a*(dp[i+1][i+1]+1)+b*(dp[i+1][i]+1);
21       for(int j=i-1;j>=1;j--)
22         dp[i][j]+=c*(dp[i+1][j+1]+1)+d*(dp[i+1][j]+1)+e*(dp[i][j+1]+1);
23     }
24     cout<<setiosflags(ios::fixed)<<setprecision(2)<<dp[1][1]<<endl;
25   }
26   return 0;
27 }
网上搜的代码

↑代码完全把左替换成右,最后的dp[1][n]改成了dp[1][1],下标变简单了。

先初始化最下面一排,然后依次递推即可。

期望公式:

dp[i][i]+=a*(dp[i+1][i+1]+1)+b*(dp[i+1][i]+1);

dp[i][j]+=c*(dp[i+1][j+1]+1)+d*(dp[i+1][j]+1)+e*(dp[i][j+1]+1);

 

2.circle(第五届省赛)

期望公式:

E[x]=0  (x==0);

E[x]=0.5*(E[x-1]+1)+0.5*(E[x+1]+1);  (x!=0)

移项得,-E[i-1]*0.5+E[i]*0.5-E[i+1]*0.5=1

n个方程高斯消元求解。因为每个方程只有三个不为零系数,所以当TLE可以适当剪枝。

 

——————————

上面两道题,首先第一步是列出期望公式,写边界条件。

第一道只要按顺序递推即可;第二道题则需列方程组高斯消元求解

产生这么大的区别的原因是:

当我们把各个状态当成是一个个节点时,概率关系为有向边,我们可看到,可递推的问题其实就是这个关系图是无环的,必须要用方程组解决的问题其实就是存在环的! 而且还要指出的是用高斯消元的时候,要注意误差的问题,最好把式子适当的增大,避免解小数,否则误差太大,估计也会卡题。

 

posted @ 2015-05-06 21:58  Travelller  阅读(213)  评论(0编辑  收藏  举报