题目链接

Solution

Wa,我是真的被期望折服了,感觉这道题拿来练手正好.

DP的难度可做又巧妙...

我们定义:

\(f[i]\) 代表到第 \(i\) 次点击的时候的最大答案.

\(g[i]\) 代表到第 \(i\) 此点击的 \(o\) 的期望长度.

然后看转移:

1.此时为 \(o\) ,那么我可以直接计算答案。

由于 \((x+1)^2=x^2+2x+1\) ,所以我们得到转移方程:

$$f[i]=f[i-1]+2*g[i-1]+1$$

同时由于此时 \(o\) 的长度已经增加,所以同时 \(g[i]=g[i-1]+1\).

2.此时为 \(x\),同样直接统计答案.

\(f[i]=f[i-1]\) , \(g[i]=0\).

3.此时为 \(?\) ,那么我们对于以上两种情况都有 \(0.5\) 的概率.

然后直接转移:

$$f[i]=0.5(f[i-1]+2g[i-1]+1+f[i-1])$$

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

然后最后面 \(f[n]\) 即为答案


Code

#include<bits/stdc++.h>
#define db double
using namespace std;
const int maxn=300008;
db f[maxn],g[maxn];
int n;
string ch;
int main()
{
cin>>n;
ch='*';
string s; cin>>s;
ch+=s;
for(int i=1;i<=n;i++)
{
if(ch[i]=='o')
{
f[i]=f[i-1]+2*g[i-1]+1;
g[i]=g[i-1]+1;
}
if(ch[i]=='x')
{
f[i]=f[i-1];
g[i]=0;
}
if(ch[i]=='?')
{
f[i]=0.5*(f[i-1]+2*g[i-1]+1+f[i-1]);
g[i]=0.5*(g[i-1]+1);
}
}
printf("%.4lf",f[n]);
}

最新文章

  1. Tornado框架中视图模板Template的使用
  2. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究
  3. java23
  4. Js获取图片原始宽高
  5. Linux系统中如何挂载第二块硬盘
  6. [转]Java Spring的Ioc控制反转Java反射原理
  7. PHP中的日期加减方法示例
  8. saltstack故障解决
  9. mongodb主从复制
  10. ASP.NET服务器控件对应的HTML标签
  11. hibernate_validator_02
  12. SQL SERVER将多行数据合并成一行(转载)
  13. sqlalchemy常用
  14. 二、Ansible中playbook的变量
  15. Xshell6设置字体大小
  16. for-in和for-of,forEach和Map
  17. IIS 修改并发连接数
  18. WDA-BOPF业务对象处理框架
  19. GridView Postback后出错Operation is not valid due to the current state of the object.
  20. bzoj hash+map+set

热门文章

  1. js 获取当前年月日时分秒星期
  2. cocos2d-x中解决暂停并保存画面和开始的功能
  3. echarts事件中获取当前实例
  4. 洛谷 P2568 GCD
  5. python中文件操作的基本方法
  6. Applied Nonparametric Statistics-lec7
  7. build_mem_type_table
  8. Cheese Aizu - 0558 (搜索题)
  9. Linux编程中链接库的使用
  10. IIS发布网站Microsoft JET Database Engine 错误 &#39;80004005&#39;的解决办法,基于Access数据库