题目大意:给定一个01序列,其中有某些字符未知(记为?),是0或1的概率相等,各50%。
序列的值定义为序列中极长的0序列的长度的平方的和。求期望值。
解:一看概率题想递推。
记f[i]为到第i位,期望值是多少。
那么如果第i位是0,那么f[i]=f[i-1]+(第i位是0的贡献)。
在f[i-1]的基础上,第i位是0对f[i]的贡献,显然就是(到第i位的极长0序列的长度)^2-(到第i-1位的极长0序列的长度)^2
所以还要统计到第i位的期望极长0序列长度,记为len[i]。那么上式的贡献计算出来就是2*len[i]-1(因为在这种情况下len[i]=len[i-1]+1)
那么如果第i位是0,则len[i]=len[i-1]+1,f[i]=f[i-1]+2*len[i]-1。
如果第i位是1也好办,len[i]=0,f[i]=f[i-1]。
但如果第i位是?,len是好办的,len[i]有50%概率=0,50%的概率=len[i-1]+1,那么期望长度是(len[i-1]+1)/2。
但是f[i]呢?开始的时候想的是这样的:f[i]=f[i-1]+(2*len[i]-1)/2=f[i-1]+len[i]-0.5,理由是这样的:既然这一位是?,
那么就有50%的概率没有贡献,即0;50%的概率贡献和第i位是0的贡献相等。所以期望贡献就除以2即可。
但可惜是不对的。
个人认为原因可以如此解释:如果用len[i](我指的是已经用len[i-1]计算出来的那个(len[i-1]+1)/2),那么len[i]就包含了第i位是1的期望。
也就是说,50%的贡献中,并不全是第i位是0带来的,还有部分是1带来的。也就是说答案会偏小。
所以全期望公式应当更加慎重小心的使用:
50%的几率长度为0,贡献为0.
50%的几率长度为len[i-1]+1,贡献为(len[i-1]+1)^2-len[i-1]^2=2*len[i-1]+1。
所以期望长度=(len[i-1]+1)/2,期望贡献为(2*len[i-1]+1)/2=len[i-1]+0.5。
注意到len[i]和f[i]都只由len/f[i-1]决定,所以只用一个变量递推即可。