BZOJ4318: OSU! (概率DP)
题意:一个串 给出每个字符为1的可能性 否则为0
一段连续的1能获得长度的立方的收益
问总收益的期望
题解:设x_i为到第i位时连续的1的期望长度
由i-1递推来的贡献 如果这一位是0没有贡献 如果是1 就是(x_i - 1 + 1)* pi
设x2_i为期望长度的平方 有(x + 1)^2 可以递推出来 x2_i = x2_i - 1 + 2 * x_i - 1 + 1
ans_i即为期望的得分 对于第i位 为0贡献就只有ans_i - 1
如果为1 就应该减去ans_i - 1以1结尾的贡献 再加上连续到i为1结尾的贡献 化简一下
#include <bits/stdc++.h> using namespace std; double p[100005]; double x[100005], x2[100005], ans[100005]; int main() { int n; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%lf", &p[i]); x[i] = p[i] * (x[i - 1] + 1.0); x2[i] = p[i] * (x2[i - 1] + 2 * x[i - 1] + 1.0); ans[i] = ans[i - 1] + p[i] * (3 * x2[i - 1] + 3 * x[i - 1] + 1); } printf("%.1lf\n", ans[n]); return 0; }