题目链接
前言
发现PKU好喜欢出概率期望dp啊,SCD1T2也是道概率期望dp。
做法
仔细观察一下最大前缀和的性质,令最大前缀和最后一个数是第i位,可以发现$[1,i]$这一段所有的后缀和都为正,(否则你减掉这一段显然可以得到一个更大的),$[i+1,n]$这一段的前缀和都非正。
考虑状压dp,以$f[i]$表示选的数的集合是i,这个状态所有后缀和均为正的方案数,$g[i]$表示选的数的集合为i,这个状态所有前缀和均不正的方案数。
两个的转移是类似的,f可以看做是前缀和,反正首尾倒过来就边后缀和了。
枚举新加入一个数放在最后,如果它与前面所有的和是正的,那么$f[i|(1<<j-1)]+=f[i]$,否则$g[i|(1<<j-1)]+=g[i]$
最后枚举最大前缀和的集合,$ans+=sum[i]*f[i]*g[(1<<n)-1-i]$.
交上去发现wa了,再仔细读一遍题目,发现最大前缀和不能为空,也就是如果每一段前缀和都是负的,我们也要选一段最大的,而不是啥都不选。而我们上面的dp显然我发处理这种情况,因为f都是0。
而这种情况的最大前缀和也有非常好的性质,除了所有加起来是负的,其他所有的后缀也都是正的。
我们只要在dp一个f1即可,$f1[i]$表示选的数的集合是i,这个状态出整个串之外的所有后缀和均为正的方案数。
转移也很简单,枚举一个新加入的数放在最后,如果它与前面所有的和是负的,那么
$f1[i|(1<<j-1)]+=f[i]$即可。
最后统计答案的时候,如果f[i]为0,把f[i]改成f1[i]即可。
代码
1 |
|