期望还乘 n!……极其迷惑……
所以实际上就是统计所有排列的最大前缀和之和。
考虑把得到的排列的前缀和以最大的那一项分割为两个排列,那么如果单取后一半的话,每一项的前缀和一定都 ≤0(否则拼起来就会出现更大的前缀和)。
于是考虑设两个状态 fS,gS,分别表示在集合 S 中的数的排列的最大前缀和为 sumS 的方案数和在集合 S 中的排列的前缀和都 ≤0 的方案数。
其中 sumS=∑i∈Sai。
显然 g 更容易转移。
gS=∑i∈Sg∁S{i} (sumS≤0)
然后考虑 f,可以通过在排列前面加数的方式转移。
fS⋃{k}←fS⋃{k}+fS (k∉S,sumS>0) 如果 sumS≤0,那么就会出现更大的前缀和(即新加的 k)。
然后随手统计答案就完事了。
代码:
1 |
|