这题吼啊...

然而还是想了$2h$,写了$1h$。

我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的。

那么,我们

令$f[i]$表示状态$i$中所有数字全部作为前缀和的方案数。

令$g[i]$表示状态$i$中所有数字所组合成的任意排列中,前缀和永远为负数的方案数。

令$s[i]$表示状态$i$中所有数字之和。

ps:若i的第j个二进制位为$1$,则表示状态$i$中,选择了数字$a_j$。($a$序列的下表为$0$到$n-1$)

通过冷静分析,不难得出:

$s[i]$很好求

$f[i]=\sum_{(2^j\ and\ i)=2^j∩s[i-2^j]+a[j]≥0} f[i-2^j]$

$g[i]=\sum_{(2^j\ and\ i)=2^j∩s[i-2^j]+a[j]<0} g[i-2^j]$

显然$f[0]=g[0]=1$。

统计答案时,分前缀和$≥0$,前缀和$<0$两类讨论。

当前缀和$≥0$时

$ans1=\sum_{i=1}^{2^n-1} s[i] \times f[i] \times g[2^n-1-i] $

当前缀和<0时

$ans2=\sum_{j=0}^{n=1} \sum_{i=0} (a[j]+s[i])\times f[i]\times g[2^n-1-i-2^j]\ \ \ [(2^j\ and\ i=0)∩s[i]<0∩s[i]>-a[j]]$

最终所求答案即$ans1+ans2$。

然后就完结了。

时间复杂度为$O(n \times 2^n)$。

 #include<bits/stdc++.h>
#define M 20
#define L long long
#define MOD 998244353
using namespace std; L f[<<M]={},g[<<M]={},a[M]={},he[<<M]={}; int main(){
int n,m; scanf("%d",&n); m=<<n;
for(int i=;i<n;i++) cin>>a[i];
for(int i=;i<m;i++)
for(int j=;j<n;j++)
if(i&(<<j)) he[i]+=a[j];
f[]=;
for(int i=;i<m;i++){
for(int j=;j<n;j++)
if((i&(<<j))&&he[i^(<<j)]+a[j]>=){
f[i]=(f[i]+f[i^(<<j)])%MOD;
}
}
for(int i=;i<n;i++) a[i]=-a[i];
for(int i=;i<m;i++) he[i]=-he[i];
g[]=;
for(int i=;i<m;i++){
for(int j=;j<n;j++)
if((i&(<<j))&&he[i^(<<j)]+a[j]>){
g[i]=(g[i]+g[i^(<<j)])%MOD;
}
}
for(int i=;i<n;i++) a[i]=-a[i];
for(int i=;i<m;i++) he[i]=-he[i];
L ans=;
for(int j=;j<n;j++) if(a[j]<){
//f[1<<j]=1;
for(int i=;i<m;i++)
if((i&(<<j))==){
if(he[i]<||he[i]>-a[j]) continue;
int hh=(m-)^i^(<<j);
ans=(ans+(a[j]+he[i])*f[i]%MOD*g[hh]%MOD+MOD)%MOD;
}
}
for(int i=;i<m;i++)
ans=(ans+f[i]*he[i]%MOD*g[(m-)^i]%MOD+MOD)%MOD;
cout<<ans<<endl;
}

【PKUSC2018】【loj6433】最大前缀和 状压dp的更多相关文章

  1. LOJ#6433. 「PKUSC2018」最大前缀和 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这 ...

  2. LOJ 6433 「PKUSC2018」最大前缀和——状压DP

    题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...

  3. [PKUSC2018]最大前缀和——状压DP

    题目链接: [PKUSC2018]最大前缀和 设$f[S]$表示二进制状态为$S$的序列,任意前缀和都小于等于$0$的方案数. 设$g[S]$表示二进制状态为$S$的序列是整个序列的最大前缀和的方案数 ...

  4. BZOJ5369:[PKUSC2018]最大前缀和(状压DP)

    Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C ...

  5. BZOJ_5369_[Pkusc2018]最大前缀和_状压DP

    BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...

  6. 「PKUSC2018」最大前缀和(状压dp)

    前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. ...

  7. Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)

    题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...

  8. 【洛谷5369】[PKUSC2018] 最大前缀和(状压DP)

    点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一 ...

  9. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

随机推荐

  1. URL编码转换函数:escape()、encodeURI()、encodeURIComponent()

          函数出现时间:                      escape()                                javascript 1.0           ...

  2. arduino uno r3 + SIM900 + USB打火机 实现电话触发点火

    需求来源 1.儿子过完年6岁,喜欢玩烟花,但是胆子小,于是我就负责点火,从年前26到大年初八,每天晚上要给儿子点鞭炮啊点鞭炮. 2.这边过年要打关门炮跟开门炮,大年初一凌晨还要起来帮老妈点鞭炮,说实在 ...

  3. SPSS—回归—二元Logistic回归案例分析

    数据分析真不是一门省油的灯,搞的人晕头转向,而且涉及到很多复杂的计算,还是书读少了,小学毕业的我,真是死了不少脑细胞, 学习二元Logistic回归有一段时间了,今天跟大家分享一下学习心得,希望多指教 ...

  4. python技巧31[python中使用enum][转]

    以下几种方法来模拟enum:(感觉方法一简单实用) # way1 class Directions:     up = 0     down = 1     left = 2     right =3 ...

  5. ROS教程

    Learning ROS 学习ROS Depending on your learning style and preferences, you can take two approaches to ...

  6. 切勿用普通for循环遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...

  7. eclipse中java build path下 allow output folders for source folders 无法勾选,该如何解决 eclipse中java build path下 allow output folders for source folders 无法勾选,

    在创建maven工程时,在设置output folders时,总是勾选以后,老是自动恢复到原来的状态,对比其他的maven的工程发现是在创建maven时候选择的项目为pom,而不是war或者jar,将 ...

  8. L-BFGS

    L-BFGS算法比较适合在大规模的数值计算中,具备牛顿法收敛速度快的特点,但不需要牛顿法那样存储Hesse矩阵,因此节省了大量的空间以及计算资源.本文主要通过对于无约束最优化问题的一些常用算法总结,一 ...

  9. ASP.NET Core真实管道详解[1]

    ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 <ASP.NET Core管道深度剖析[共4篇]> 中围绕着一个经过极度简化的模拟 ...

  10. 万恶的KPI、新兴的OKR及让人纠结的程序员考核

    最近两天在研究研发部门如何进行绩效管理(其实一直都在思考,关注,实践,总感觉无从下手,也想求助咨询公司,无奈囊中羞涩).查了两天的资料,主要的方向是KPI,OKR,谷歌等互联网公司的考核方法.这里做个 ...