题目:https://www.luogu.org/problemnew/show/P1365
平方和怎样递推?
其实就是 (x+1)^2 = x^2 + 2*x + 1;
所以我们要关注这里的 x ——连续的 o 的期望长度;
另开一个数组 d 记录期望长度,转移即可。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int const maxn=300005; int n; double f[maxn],d[maxn]; char ch[maxn]; int main() { scanf("%d",&n); cin>>ch+1; for(int i=1;i<=n;i++) { if(ch[i]=='o') { d[i]=d[i-1]+1; f[i]=f[i-1]+2*d[i-1]+1; } if(ch[i]=='x') { d[i]=0; f[i]=f[i-1]; } if(ch[i]=='?') { d[i]=(d[i-1]+1)/2; f[i]=(f[i-1]*2+2*d[i-1]+1)/2; } } printf("%.4lf",f[n]); return 0; }