zoukankan      html  css  js  c++  java
  • ●BZOJ 4318 OSU!

    题链:

    http://www.lydsy.com/JudgeOnline/problem.php?id=4318
    题解:

    期望dp
    如果我们能够得到以每个位置结尾形成的连续1的长度的相关期望,那么问题就好解决了。

    定义g[i]表示以1位置结尾的连续1的长度的期望。
    转移显然:g[i]=p[i]*(g[i]+1)
    然后定义h[i]表示以1位置结尾的连续1的长度的平方的期望
    由于(x+1)^2=x^2+2x+1,
    所以h[i]=p[i]*(h[i-1]+2*g[i-1]+1)

    最后定义f[i]表示1~i这个区间期望能得到的分数,
    分为此时i位置得到1和得到0两种情况:
    得到1,由于(x+1)^3=x^3+3*x^2+3x+1 那么贡献为:p[i]*(f[i-1]+3*h[i-1]+3*g[i-1]+1)
    得到0,那么直接为前面的期望得分,贡献为(1-p[i])*f[i-1]
    所以f[i]的转移为:f[i]=(得到1)p[i]*(f[i-1]+3*h[i-1]+3*g[i-1]+1)+(得到0)(1-p)*f[i-1];

    .....................................................................

    ==,难道没有感觉这个f[i]的转移有一丝丝诡异么?
    先看看这个错的做法,
    多了一个d[i],表示以i结尾形成的连续1的长度的3次方的期望。
    那么其转移类似g和h的转移:
    d[i]=p[i]*(d[i-1]+3*h[i-1]+3*g[i-1]+1)
    然后再去求得f[i],同样地分为当前第i位得到1和得到0两种情况:
    f[i]=(得到1)d[i]+(得到0)(1-p[i])*f[i-1]

    乍一看似乎没问题,但是在(得到1)那里却出了问题:
    f[i]表示的是1~i这个区间期望能够得到的分数,
    但是在(得到1)这个转移这里,我们却只考虑了以i结尾的期望的那段1的贡献,然而其它部分的贡献就没有转移过来。
    这也就是这个做法得到的答案比正确答案小的原因。
    (可以强行把之前的贡献再加进来么?233,我反正加不来。。。)

    .......................................................................

    现在再反过来看看之前正确的f[i]的求法(没有d[i]数组的那个做法)
    f[i]=(得到1)p[i]*(f[i-1]+3*h[i-1]+3*g[i-1]+1)+(得到0)(1-p)*f[i-1];

    显然(得到0)的那个转移没有问题。

    那么我们来想想(得到1)的那么那个转移是如何解决掉那个错误做法出现的问题的。
    由于f[i-1]表示的是区间1~i-1的期望得分,
    那么我们就可以把f[i-1]看成是由两个部分组成的:
    一个部分是以i-1结尾的期望的那段连续的1造成的贡献A(一个长度的3次方的期望),另一部分则是其它部分的贡献B:
    所以(得到1)这个转移可以看成是:p[i]*(B+A+3*h[i-1]+3*g[i-1]+1),
    显然,后面的A+3*h[i-1]+3*g[i-1]+1计算的就是以i结尾形成的连续1的长度的3次方的期望,
    而B则是其它部分的贡献。
    所以就是这样巧妙地把新的贡献和其它部分的贡献都统计进了f[i]里面。

    以上就是个人的见解。


    代码:

    #include<bits/stdc++.h>
    #define MAXN 100005
    using namespace std;
    double g[MAXN],h[MAXN],f[MAXN],p;
    int N;
    int main(){
    	ios::sync_with_stdio(0);
    	cin>>N;
    	for(int i=1;i<=N;i++){
    		cin>>p;
    		g[i]=p*(g[i-1]+1);
    		h[i]=p*(h[i-1]+2*g[i-1]+1);
    		f[i]=p*(f[i-1]+3*h[i-1]+3*g[i-1]+1)+(1-p)*f[i-1];
    	}
    	cout<<fixed<<setprecision(1)<<f[N]<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    Vuecli3项目引入网页视频流媒体播放器EasyPlayer.JS报videojs not definde错误如何解决?
    穷人和富人的区别
    如何使用PCATTCP测试局域网传输速度
    DirectFB同时显示到X11和VNC上
    使用Openssl生成CA及签发证书方法
    内存泄漏定位
    关于在C++开发的项目中引用后缀名为.c文件的一句话提醒
    在Win32下建立GTK开发环境
    GTK/DFB中的WaitCursor
    GTK+/DFB优化
  • 原文地址:https://www.cnblogs.com/zj75211/p/8543018.html
Copyright © 2011-2022 走看看