博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】4318: OSU! 期望DP
阅读量:6365 次
发布时间:2019-06-23

本文共 973 字,大约阅读时间需要 3 分钟。

【题意】有一个长度为n的01序列,每一段极大的连续1的价值是L^3(长度L)。现在给定n个实数表示该位为1的概率,求期望总价值。n<=10^5。

【算法】期望DP

【题解】后缀长度是一个很关键的量,设g[i]表示前i个的期望后缀长度。根据全期望公式,依赖于第i-1位为0或1:(以下所有公式最后省略+(1-ai)*0)

$$g[i]=a_i*(g[i-1]+1)$$

设f[i]表示前i个的期望长度,当第i-1位为1时,f[i]相对于f[i-1]的后缀多了[ (g[i-1]+1)^3 ] - [ g[i-1]^3 ]的代价,即:

$$f[i]=f[i-1]+a_i*(3*g^2[i-1]+3*g[i-1]+1)$$

等等,这没有结束,只有加法和乘法满足期望的线性,不包括乘方。通俗地说,期望的乘方不等于乘方的期望。

设g2[i]表示前i个的期望“后缀长度的平方”,同样的g2[i]相对于g2[i-1]多了[ (g[i-1]+1)^2 ] - [ g[i-1]^2 ],即:

$$g_2[i]=a_i*(g_2[i-1]+2*g[i-1]+1)$$

复杂度O(n)。

#include
#include
#include
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

 

转载于:https://www.cnblogs.com/onioncyc/p/7224975.html

你可能感兴趣的文章
espresso 2.0.4 Apple Xcode 4.4.1 coteditor 价格
查看>>
Goldengate 维护
查看>>
ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证
查看>>
所有转义字符
查看>>
C# 属性事件一些设置说明
查看>>
去除UITableViewheader footer黏性
查看>>
windows2003 iis6.0不能显示asp.net选项
查看>>
xen MacOS
查看>>
如何学好C和C++
查看>>
Gitlab通过custom_hooks自动更新服务器代码
查看>>
我的友情链接
查看>>
python 如何判断调用系统命令是否执行成功
查看>>
Lesson10 vSphere 管理特性
查看>>
memcache 扩展和 memcached扩展安装
查看>>
好程序员的查克拉---自信
查看>>
线程池的设计(二):领导者追随者线程池的设计
查看>>
获取设备列表
查看>>
Django使用网上模板做个能展示的博客
查看>>
基于同IP不同端口,同端口不同Ip的虚拟主机 基于FQDN的虚拟主机
查看>>
项目软件集成三方模块,编译中int32和uint32定义冲突解决方法
查看>>