@ysner
2018-10-03T16:27:01.000000Z
字数 1103
阅读 2608
DP 期望
一共有次操作,每次操作只有成功与失败之分,成功对应,失败对应,次操作对应为个长度为的串。
在这个串中连续的个可以贡献的分数,这个不能被其他连续的所包含。
现在给出,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留位小数。
丽洁姐姐的题目套路真多
想想如果又添一个会怎么样?
贡献将变为为
实际增加量为
这个玩意怎么求呢?
设表示以为结尾的串的期望长度。(表增量)
表示以为结尾的串期望长度的平方。(表增量)
表示到时串的期望得分。(累计答案)
的转移可以应用完全平方公式:
F3的转移就是概率乘结果:
#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define ll long long#define re register#define il inline#define pb(a) push_back(a)#define fp(i,a,b) for(re int i=a;i<=b;i++)#define fq(i,a,b) for(re int i=a;i>=b;i--)using namespace std;const int N=1e5+100;int n;double x1[N],x2[N],x3[N],p;il int gi(){re int x=0,t=1;re char ch=getchar();while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();if(ch=='-') t=-1,ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*t;}int main(){n=gi();fp(i,1,n){scanf("%lf",&p);x1[i]=(x1[i-1]+1)*p;x2[i]=(x2[i-1]+2*x1[i-1]+1)*p;x3[i]=x3[i-1]+(3*x2[i-1]+3*x1[i-1]+1)*p;}printf("%.1f\n",x3[n]);return 0;}
