【传送门:BZOJ4318】
简要题意:
给出n个位置,每个位置可以有a[i]的概率会变成1,1-a[i]的概率为0,最后会变成一个长度为n的01串,而每个01串中,连续x个1会带来x3的价值(这x个1不能被其他连续的1所覆盖),求出期望分数
题解:
期望DP
太神了。。
首先假设当前有一个串,它的后缀有x个1,那么在它的下一个位置出现1的价值就是(x+1)3-x3=3x2+3x+1,期望就是a[i]*(3x2+3x+1)
而我们可以得到x和x2的期望
那么这道题就可以做了
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; double x[110000],x2[110000],a[110000],f[110000]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lf",&a[i]); x[i]=(x[i-1]+1)*a[i]; x2[i]=(x2[i-1]+2*x[i-1]+1)*a[i]; f[i]=f[i-1]+(3*x2[i-1]+3*x[i-1]+1)*a[i]; } printf("%.1lf ",f[n]); return 0; }