codeforces 235B 概率DP

codeforces 235B


题意:

n O X i O p i 给出一段长为n的字符串,只含‘O’和‘X’,第i个位置出现‘O’的概率为p_i。
k O k 2 若字符串中出现连续k个‘O’,则得分加上k^2。
问最终得分的期望。


题解:

d p [ i ] i dp[i]表示前i个字符得分的期望。
2 C n 2 + n = n 2 , 引入排列组合恒等式2C_n^2+n=n^2,转化记分方式

  • d p [ i ] = ( d p [ i 1 ] + p [ i 1 ] ) p [ i ] dp[i]=(dp[i-1]+p[i-1])*p[i]
  • a n s = i = 1 n p [ i ] + i = 2 n d p [ i ] 2 ans=\displaystyle\sum_{i=1}^{n} p[i]+\displaystyle\sum_{i=2}^{n} dp[i]*2

#include <bits\stdc++.h>
using namespace std;
const int N = 100001;
double p[N];
double dp[N];

int main() {
    int n;
    cin >> n;
    double ans = 0;
    for(int i = 1 ; i <= n ; i++){
        cin >> p[i];
        ans += p[i];
    }
    for(int i = 2 ; i <= n ; i++){
        dp[i] = (dp[i-1]+p[i-1])*p[i];
        ans += dp[i]*2;
    }
    cout << setiosflags(ios::fixed) << setprecision(15) << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/CSDN_PatrickStar/article/details/89819926