[关闭]
@ysner 2018-10-04T00:27:01.000000Z 字数 1103 阅读 2030

luogu1654 OSU!

DP 期望


题面

一共有次操作,每次操作只有成功与失败之分,成功对应,失败对应次操作对应为个长度为串。
在这个串中连续的可以贡献的分数,这不能被其他连续的所包含。
现在给出,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留位小数。

解析

丽洁姐姐的题目套路真多
想想如果又添一个会怎么样?
贡献将变为为
实际增加量为

这个玩意怎么求呢?
表示以为结尾的串的期望长度。(表增量)
表示以为结尾的串期望长度的平方。(表增量)
表示到时串的期望得分。(累计答案)

的转移可以应用完全平方公式:

F3的转移就是概率乘结果:

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #define ll long long
  8. #define re register
  9. #define il inline
  10. #define pb(a) push_back(a)
  11. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  12. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  13. using namespace std;
  14. const int N=1e5+100;
  15. int n;
  16. double x1[N],x2[N],x3[N],p;
  17. il int gi()
  18. {
  19. re int x=0,t=1;
  20. re char ch=getchar();
  21. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  22. if(ch=='-') t=-1,ch=getchar();
  23. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  24. return x*t;
  25. }
  26. int main()
  27. {
  28. n=gi();
  29. fp(i,1,n)
  30. {
  31. scanf("%lf",&p);
  32. x1[i]=(x1[i-1]+1)*p;
  33. x2[i]=(x2[i-1]+2*x1[i-1]+1)*p;
  34. x3[i]=x3[i-1]+(3*x2[i-1]+3*x1[i-1]+1)*p;
  35. }
  36. printf("%.1f\n",x3[n]);
  37. return 0;
  38. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注