BZOJ 3450 Tyvj1952 Easy 期望DP

14 篇文章 1 订阅

题目大意:给定一个OX序列,一些点未确定,连续len长度的O会得到len^2的收益,求期望收益值

令f[i]为第i个点的期望收益值,l[i]为第i个点的期望长度

如果一个点是'O' 那么l[i]=l[i-1]+1 f[i]=f[i-1]+(l[i]*2-1)

如果一个点是'X' 那么l[i]=0 f[i]=f[i-1]

如果一个点是'?' 那么l[i]=(l[i-1]+1)/2 f[i]=f[i-1]+(l[i]*2-1)

等等 好像有些问题- -

如果一个点长度为1那么增加的收益显然是(1*2-1) 长度为2那么增加的收益显然是(2*2-1)

可是如果长度为0那么增加的收益是(0*2-1)么?显然不是

实际上如果长度为0那么收益可以按照长度为0.5计算

那么最后一个递推式改成f[i]=f[i-1]+(l[i-1]+0.5)即可

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 300300
using namespace std;
int n;
char s[M];
double f[M],l[M];
//f[i]表示第i个点的期望得分
//l[i]表示第i个点的期望长度
int main()
{
	int i;
	cin>>n;
	scanf("%s",s+1);
	for(i=1;i<=n;i++)
	{
		switch(s[i])
		{
			case 'o':
				l[i]=l[i-1]+1;
				f[i]=f[i-1]+(l[i]+l[i]-1);
				break;
			case 'x':
				l[i]=0;
				f[i]=f[i-1];
				break;
			case '?':
				l[i]=(l[i-1]+1)/2.0;
				f[i]=f[i-1]+(l[i-1]+0.5);
				break;
		}
	}
	printf("%.4lf\n",f[n]);
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值