1. 程式人生 > >【BZOJ】4318: OSU!

【BZOJ】4318: OSU!

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++)
    {
        
double 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; }
View Code

【BZOJ】4318: OSU!