PKUSC2018 最大前缀和

这个期望显然是诈骗,即统计每种排列最大前缀和之和。

对于某个排列 \(a\),令 \(s(l,r)=\sum\limits_{k=l}^ra_k\)。考虑前缀 \([1,i]\) 成为答案的充要条件

  • \(\forall 1<j\le i,s(j,i)\ge 0\),否则可以去掉这段。
  • \(\forall j>i,s(i+1,j)<0\),否则加上这段不劣(钦定取的是最大并且最靠后的前缀)。

那么可以考虑状压,设 \(f_S\) 为选择 \(S\) 这个集合作为 \([i+1,n]\) 并且满足第 \(2\) 个条件的方案数,设 \(g_S\) 为选择 \(S\) 这个集合作为 \([2,i]\) 并且满足第 \(1\) 个条件的方案数。转移的话就考虑哪个数塞到开头/结尾即可。

统计答案时枚举第 \(1\) 位填 \(a_i\),然后枚举集合 \(S\) 作为合法的前缀,计算方案数用 \(g_S\)\(f_{U\setminus (S\cup\{i\})}\) 即可,即:

\[\text{ans}=\sum\limits_{i=1}^n\sum\limits_{S\subseteq U\setminus\{i\}}\left(\sum\limits_{k\in S\cup\{i\}}a_k\right)g_Sf_{U\setminus(S\cup \{i\})} \]

复杂度 \(O(n2^n)\)

posted @ 2023-07-20 18:22  Ender_32k  阅读(5)  评论(0编辑  收藏  举报