[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可以适当剪枝。
——————————
上面两道题,首先第一步是列出期望公式,写边界条件。
第一道只要按顺序递推即可;第二道题则需列方程组高斯消元求解
产生这么大的区别的原因是:
当我们把各个状态当成是一个个节点时,概率关系为有向边,我们可看到,可递推的问题其实就是这个关系图是无环的,必须要用方程组解决的问题其实就是存在环的! 而且还要指出的是用高斯消元的时候,要注意误差的问题,最好把式子适当的增大,避免解小数,否则误差太大,估计也会卡题。