标签:期望 个数 栈顶 frac rightarrow 配对 dp define
有一个栈,随机插入 $n$ 次 $0$/$1$
如果栈顶是 $1$,然后插入 $0$,则将这两个元素都弹出,否则,插入栈顶.
求:$n$ 次操作后栈中期望的元素个数.
我们发现,按照上述弹栈方式进行,栈中元素一定是由若干个连续 $0$ 加上若干个连续 $1$ 组成.
而 $1$ 所在的联通块还在栈顶,所以我们只需考虑 $1$ 的个数即可.
令 $f[i][j]$ 表示 $i$ 次操作过后,栈中有 $j$ 个 $1$ 时期望的元素个数.
由于期望在任何时候都有可加性,所以 $f[i+1][]$ 的期望可以表示成 $f[i][]$ 加上新加入/删掉 $1$ 的期望.
我们令 $p[i][j]$ 表示 $i$ 轮操作后栈中有 $j$ 个 $1$ 的手游概率,那么有 $\frac{f[i][j]+p[i][j]}{2}\rightarrow f[i+1][j+1]$
因为 $i$ 轮后有 $j$ 个 $1$ 的期望个数是 $f[i][j]$,而下一轮要保证抽到的还是 $1$,所以概率为 $\frac{1}{2}$
即 $f[i][j]\times \frac{1}{2}$ 但是在当前局面增加的长度绝对不是 $\frac{1}{2}$ 因为期望等于概率乘以权值.
而 $i$ 轮后有 $j$ 个 $1$手游http://www.diuxie.com 的长度的概率是 $p[i][j]$,而下一次还抽到 $1$ 的概率是 $\frac{1}{2}$,权值是 $1$
所以累加的是 $\frac{p[i][j]}{2}$
整理可得 $\frac{f[i][j]+p[i][j]}{2}\rightarrow f[i+1][j+1]$,$\frac{f[i][j]-p[i][j]}{2}\rightarrow f[i+1][j-1]
#include <bits/stdc++.h>
#define N 2004
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
double p[N][N],f[N][N];
int main()
{
// setIO("input");
int i,j,n;
scanf("%d",&n), p[0][0]=1;
double ans=0.0;
for(i=0;i<n;++i)
{
p[i+1][1]+=p[i][0]/2, f[i+1][1]+=(f[i][0]+p[i][0])/2;
p[i+1][0]+=p[i][0]/2, f[i+1][0]+=(f[i][0]+p[i][0])/2;
for(j=1;j<n;++j)
{
p[i+1][j+1]+=p[i][j]/2, f[i+1][j+1]+=(f[i][j]+p[i][j])/2;
p[i+1][j-1]+=p[i][j]/2, f[i+1][j-1]+=(f[i][j]-p[i][j])/2;
}
}
for(i=0;i<=n;++i) ans+=f[n][i];
printf("%.3f\n",ans);
return 0;
}
标签:期望,个数,栈顶,frac,rightarrow,配对,dp,define 来源: https://blog.51cto.com/u_14967986/3000594
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。