【BZOJ】4318: OSU!
阿新 • • 發佈:2017-07-23
ron 元素 發現 scanf line clas n) ble 收益
【算法】期望DP
【題解】
OSU!(誤)
原本在糾結長度很不好算啊……x有好多種可能,新增一個不知道加多少QAQ
後來發現我們不是在算期望嘛……不是就算期望長度就好了嘛。
f[i]為加入第i個後的收益。
g[i]為加入第i個後的期望長度。
加入一個i=1的收益為x^3-(x-1)^3=3x^2-3x+1
註意不能直接g[i]*g[i]表示平方,因為平方不是線性運算,期望的平方≠平方的期望。
g2[i]為期望長度的平方。
推導方式中(x-1)--->x和x--->(x+1)的區別:
我們設置g2[i]是為了避免直接對期望平方,而采用遞推的方式保持線性運算。
遞推的方式是p(i)=[p(i-1)...]*x+0*(1-x),所以[p(i-1)...]的部分是直接後面接一個x的(默認概率為1)
如果是(x-1)--->x的話,推導過程中使用了x的元素,而x的元素已經加入了x的概率計算。
所以必須采用x--->(x+1)的方式,使概率計算不重復。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=100010; double f[maxn],g[maxn],g2[maxn]; int n; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) {View Codedouble x; scanf("%lf",&x); g[i]=(g[i-1]+1)*x; g2[i]=(g2[i-1]+2*g[i-1]+1)*x; f[i]=f[i-1]+(3*g2[i-1]+3*g[i-1]+1)*x; } printf("%.1lf",f[n]); return 0; }
【BZOJ】4318: OSU!