【期望DP】[UVA1498] Activation

太过爱你忘了你带给我的痛 2023-06-01 06:09 112阅读 0赞

显然是概率DP

我们用dp[i][j]表示队伍中有i个人,lyk的小迷妹现在排在j这个位置时的概率大小

不难列出下列转移方程:

(显然已经排到前面k个位置的时候是要加上爆炸也就是p4的概率的)


f[i][1]=f[i][1]*p1+f[i][i]*p2+p4
f[i][j]=f[i][j]*p1+f[i][j-1]*p2+f[i-1][j-1]*p3+p4(j∈[2,k])
f[i][j]=f[i][j]*p1+f[i][j-1]*p2+f[i-1][j-1]*p3(j∈[k+1,i])


这是一个从前往后递推的过程,但是十分不和谐的是:f[i][1]的递推式中出现了$f[i][i]$,显然我们要想办法把这玩意儿给消掉

先化简,把两边同类项合并了,结果是这样的:


f[i][1]=f[i][i]*\frac{p2}{1-p1}+\frac{p4}{1-p1}
f[i][j]=f[i][j-1]*\frac{p2}{1-p1}+f[i-1][j-1]*\frac{p3}{1-p1}+\frac{p4}{1-p1}(j∈[2,k])
f[i][j]=f[i][j-1]*\frac{p2}{1-p1}+f[i-1][j-1]*\frac{p3}{1-p1}(j∈[k+1,i])


由于从前往后递推,在求f[i][j]是,f[i-1][]的所有值我们已经求出来了,所以可以看做常数,p1,p2,p3,p4显然已知,也是常数

所以我们可以把这玩意为当做方程解,我们只要把f[i][i]看做未知数,在不断的迭代下去即可

大概是这个样子:


不妨令a=$\frac{p2}{1-p1}$,$b=\frac{p3}{1-p1}$,$c=\frac{p4}{1-p1}$

设$C_j=f[i-1][j-1]*c+d$

则有:f[i][1]=f[i][i]*a+c
f[i][2]=f[i][1]*a+C_2
(然后把f[i][1]代入②式,依次类推……)


最后我们把式子最后面的常数部分设成sol

显然可以得到f[i][i]=a^{i}*f[i][i]+sol

也就是说
f[i][i]=\frac{sol}{1-a^i}

这样填完所有$f[][]$的表之后这道题也就解决了qaq

不过因为空间限制,我们要压掉f[][]第一维(f[i][]的值只与f[i-1][]有关)

代码实现在这里哦~

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 inline int read(){
  4. 4 int ans=0,f=1;char chr=getchar();
  5. 5 while(!isdigit(chr)){
  6. if(chr=='-')f=-1;chr=getchar();}
  7. 6 while(isdigit(chr)) {ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();}
  8. 7 return ans*f;
  9. 8 }const int M = 2005;int n,m,k;
  10. 9 double f[2][M],p1,p2,p3,p4,a,b,c,v[M],p[M];
  11. 10 int main(){
  12. 11 while(~scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)){
  13. 12 if(fabs(p4)<=1e-5) {puts("0.00000");continue;}//p4为0时显然不可能
  14. 13 a=p2/(1-p1),b=p3/(1-p1),c=p4/(1-p1);
  15. 14 v[0]=1;for(int i=1;i<=n;i++) v[i]=v[i-1]*a;//预处理a的i次方
  16. 15 p[1]=c;f[1][1]=p4/(1-p1-p2);
  17. 16 for(int i=2;i<=n;i++){
  18. 17 double sol=0;
  19. 18 for(int j=2;j<=k;j++) p[j]=f[i-1&1][j-1]*b+c;
  20. 19 for(int j=k+1;j<=i;j++) p[j]=f[i-1&1][j-1]*b;//求每一个方程式的常数项
  21. 20 for(int j=1;j<=i;j++) sol+=v[i-j]*p[j];//求最后一个式子f[i][i]=......的常数项
  22. 21 f[i&1][i]=sol/(1-v[i]);
  23. 22 f[i&1][1]=f[i&1][i]*a+c;//回代消元
  24. 23 for(int j=2;j<i;j++) f[i&1][j]=f[i&1][j-1]*a+p[j];//回去填表
  25. 24 }printf("%.5lf\n",f[n&1][m]);
  26. 25 }
  27. 26 return 0;
  28. 27 }

转载于:https://www.cnblogs.com/zhenglw/p/11299699.html

发表评论

表情:
评论列表 (有 0 条评论,112人围观)

还没有评论,来说两句吧...

相关阅读

    相关 期望DP入门

    期望DP一般步骤: 1.模拟过程,找出线性性质,作为阶段(这本质上也是线性DP) 2.涉及DP状态 原则: 体现线性性质 体现边权 根据对期望有无贡献来设计状态

    相关 期望、方差

    一、期望和方差的定义 随机变量(Random Variable) X 是一个映射,把随机试验的结果与实数建立起了一一对应的关系。而期望与方差是随机变量的两个重要的数字特征

    相关 洛谷P1498 南蛮图腾

    题目描述 自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少