您的位置:首页 > 其它

BZOJ 3450: Tyvj1952 Easy 期望DP

2017-01-16 21:37 369 查看
一道期望DP入门题,我们维护两个数组,一个是len数组,代表到达第i位期望连续长度为多少,len数组相当好维护,如果这位是o,那么len[i]=len[i-1]+1,如果这位是x,那么len[i]=0,如果这位是?那么len[i]就等于上述两种情况的值加和除以2,然后我们再维护一个ans数组,代表达到第i位的期望得分是多少,这个数组的维护也很显然,如果这位是o,那么ans[i]=ans[i-1]+2*len[i-1]+1(自己推一下就明白了),如果是x,那么ans[i]=ans[i-1],如果是?就等于上述两种情况的加和除以2,这样维护完输出ans[len]就可以了。

(我就不用long double -_-)

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<ctime>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
double ans[1000000];
double len[1000000];
char s[1000000];
int main()
{
int n;
scanf("%d",&n);
scanf("%s",s+1);
for(int i=1;i<=n;i++)
{
if(s[i]=='o')
{
len[i]=len[i-1]+1;
ans[i]=ans[i-1]+2*len[i-1]+1;
}
else if(s[i]=='x')
{
len[i]=0;
ans[i]=ans[i-1];
}
else
{
len[i]=(len[i-1]+1.0)/2.0;
ans[i]=ans[i-1]+len[i-1]+0.5;
}
}
printf("%.4lf",ans
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 期望