zoukankan      html  css  js  c++  java
  • BZOJ 4318 OSU! (概率DP)

    题意

    中文题面,难得解释了 题目传送门


    分析

    • 考虑到概率DPDP,显然可以想到f(i,j)f(i,j)表示到第ii位末尾有jj11的期望值。最后输出f(n+1,0)f(n+1,0)即可
    • n<=100000n<=100000
    • xx表示连续的11的个数。所以想想怎么可以得到 x3x^3
    • x3=(x1)3+3(x1)2+3(x1)+1x^3=(x-1)^3+3(x-1)^2+3(x-1)+1
    • EE表示期望,记p[i]p[i]表示第ii位选11的概率,则E(x3)=( E((x1)3)+E(3(x1)2)+E(3(x1))+E(1) )p[i]E(x^3)=( E((x-1)^3)+E(3(x-1)^2)+E(3(x-1))+E(1) )*p[i]
    • 那么我们假设f1f1表示存在于末尾xx的期望值;f2f2表示存在于末尾x2x^2的期望值;f3f3表示前面的所有x3x^3的期望值,也就是答案。
    • 转移方程式就为:
      f3(i)=f3(i1)+(3f2(i1)+3f1(i1)+1)p[i]f2(i)=(f2(i1)+2f2(i1)+1)p[i]f1(i)=(f1(i1)+1)p[i]egin{aligned}f3(i)&=f3(i-1)+(3f2(i-1)+3f1(i-1)+1)*p[i]\ f2(i)&=(f2(i-1)+2f2(i-1)+1)*p[i]\ f1(i)&=(f1(i-1)+1)*p[i]end{aligned}
    • 本来第一个方程式看起来有点奇怪,其实那是合并之后的结果。我们记LastLasti1i-1之前的已经完结E(x3)E(x^3)的总和,这一部分只是为了为最终输出的答案做贡献才放在f3f3里。那么剩下的记为NowNow,就是未完结、存在于末尾的E(x3)E(x^3)。有Last+Now=f3(i1)Last+Now=f3(i-1)
      • 假如这个位置选了00,那么不会再往后做贡献,但是要把这一部分加到最终答案里面去。这一部分值为Now(1p[i])Now*(1-p[i])
      • 否则将会对后面产生贡献,值为Nowp[i]Now*p[i],其实也就是充当E(x3)=( E((x1)3)+E(3(x1)2)+E(3(x1))+E(1) )p[i]E(x^3)=( E((x-1)^3)+E(3(x-1)^2)+E(3(x-1))+E(1) )*p[i]中的E((x1)3)E((x-1)^3)
    • 所以f3(i)=Last+Now(1p[i])+(Now+3f2(i1)+3f1(i1)+1)p[i]=Last+Now((1p[i)]+p[i])+(3f2(i1)+3f1(i1)+1)p[i]=Last+Now+(3f2(i1)+3f1(i1)+1)p[i]=f3(i1)+(3f2(i1)+3f1(i1)+1)p[i]egin{aligned}f3(i)&=Last+Now*(1-p[i])+(Now+3f2(i-1)+3f1(i-1)+1)*p[i]\&=Last+Now*((1-p[i)]+p[i]) + (3f2(i-1)+3f1(i-1)+1)*p[i]\&=Last + Now+ (3f2(i-1)+3f1(i-1)+1)*p[i]\&=f3(i-1)+(3f2(i-1)+3f1(i-1)+1)*p[i]end{aligned}
    • 而且DPDP时不用开数组
    AC Code(300B)
    #include <bits/stdc++.h>
    using namespace std;
    int main () {
    	int n;
    	scanf("%d", &n);
    	double f1 = 0, f2 = 0, f3 = 0, p;
    	while(n--) {
    		scanf("%lf", &p);
    		f3 += (3*f1 + 3*f2 + 1) * p;
    		f2 = (f2 + 2*f1 + 1) * p;
    		f1 = (f1 + 1) * p;
    	}
    	printf("%.1f
    ", f3);
    }
    
  • 相关阅读:
    【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程
    【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
    【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
    【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
    【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程
    【转】 Pro Android学习笔记(八十):服务(5):访问远程服务
    【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
    【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件
    Windows2008 R2上完全卸载Oracle操作步骤(转)
    win7系统清除USBSTOR记录
  • 原文地址:https://www.cnblogs.com/Orz-IE/p/12039432.html
Copyright © 2011-2022 走看看