题目链接:洛谷

题目大意:给定一个长为$n$的整数序列,求全排列的最大前缀和(必须包含第一个数)之和。

数据范围:$1\leq n\leq 20,1\leq \sum_{i=1}^n|a_i|\leq 10^9$


神级状压dp,不得不服。。。

我们考虑对全排列的最大前缀和的前缀的集合进行dp。

设$f[S],g[S]$分别表示集合$S$内的数组成的排列中,最大前缀和为$sum[S]$和负数的排列数,其中$sum[S]$为$\sum_{i\in S}i$

我们发现,如果这个最大的前缀组成的集合就是$S$,当且仅当前$|S|$个数的最大前缀和为$sum[S]$,后面$n-|S|$个数的最大前缀和为负数,所以

$$ans=\sum_{S\subset U}sum[S]*f[S]*g[U-S]$$

其中$U$表示全集。注意这里$g[S]$必须要求是负数才可以,0不行,否则可能会重复统计。

然后考虑对$f,g$进行dp。

若$sum[S]\geq 0$,则$g[S]=0$,否则枚举最后一个数$j$,即$g[S]=\sum_{j\in S}g[S-\{j\}]$

若$sum[S]\geq 0$,则对于$j\notin S$,$f[S+\{j\}]+=f[S]$,否则$f[S]$对$f[S+\{j\}]$无贡献。

时间复杂度$O(n2^n)$,空间复杂度$O(2^n)$

 #include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = << , mod = ;
int n, lim, sum[N], f[N], g[N], ans;
inline int add(int a, int b){int c = a + b; return c >= mod ? (c - mod) : c;}
int main(){
scanf("%d", &n); lim = << n; g[] = ;
for(Rint i = ;i < n;i ++){
scanf("%d", sum + ( << i));
f[ << i] = ;
}
for(Rint i = ;i < lim;i ++)
sum[i] = add(sum[i ^ (i & -i)], sum[i & -i]);
for(Rint i = ;i < lim;i ++)
if(sum[i] >= ){
for(Rint j = ;j < n;j ++)
if(!(i & ( << j))) f[i | ( << j)] = add(f[i | ( << j)], f[i]);
} else {
for(Rint j = ;j < n;j ++)
if(i & ( << j)) g[i] = add(g[i], g[i ^ ( << j)]);
}
for(Rint i = ;i < lim;i ++)
ans = add(ans, (LL) sum[i] * f[i] % mod * g[lim - - i] % mod) % mod;
printf("%d", (ans % mod + mod) % mod);
}

Luogu5369

Luogu5369 [PKUSC2018]最大前缀和的更多相关文章

  1. [PKUSC2018]最大前缀和

    [PKUSC2018]最大前缀和 题目大意: 有\(n(n\le20)\)个数\(A_i(|A_i|\le10^9)\).求这\(n\)个数在随机打乱后最大前缀和的期望值与\(n!\)的积在模\(99 ...

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

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

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

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

  4. LOJ6433 [PKUSC2018] 最大前缀和 【状压DP】

    题目分析: 容易想到若集合$S$为前缀时,$S$外的所有元素的排列的前缀是小于$0$的,DP可以做到,令排列前缀个数小于0的是g[S]. 令f[S]表示$S$是前缀,转移可以通过在前面插入元素完成. ...

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

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

  6. BZOJ5369 [Pkusc2018]最大前缀和

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

  7. bzoj 5369: [Pkusc2018]最大前缀和

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

  8. [PKUSC2018]最大前缀和(DP)

    题意:求一个序列随机打乱后最大前缀和的期望. 考场上发现不管怎么设状态都写不出来,实际上只要稍微转换一下就好了. 一个前缀[1..k]是最大前缀,当且仅当前面的所有后缀[k-1,k],[k-2,k], ...

  9. P5369 [PKUSC2018]最大前缀和

    状态压缩 P5369 题意:求所有排列下的最大前缀和之和 一步转化: 求最大前缀和的前缀由数集S组成的方案数, 统计答案时直接乘上sum(S)即可 考虑最大前缀和的性质: 设最大前缀和为sum[i] ...

随机推荐

  1. hadoop2.7.7 分布式集群安装与配置

    环境准备 服务器四台: 系统信息 角色 hostname IP地址 Centos7.4 Mster hadoop-master-001 10.0.15.100 Centos7.4 Slave hado ...

  2. java异常那些事

    异常的基本定义: 异常情形是指阻止当前方法或者作用域继续执行的问题.在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因 ...

  3. python 创建es mapping

    import requests def get_(): url = "http://127.0.0.1:9200/indextest/_mapping?pretty" ss = r ...

  4. R|批量循环处理同一格式文件-csv,txt,excel

    本文首发于“生信补给站”微信公众号,https://mp.weixin.qq.com/s/8IfMrSr9xc8_1Y2_9Ne6hg 在一个文件夹下有很多字段一致,格式统一的数据文件(csv,txt ...

  5. (一)Maven基础及第一个Maven工程

    一.Maven介绍 ANT/Maven/gradle是一个项目管理工具,它包含了一项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecy ...

  6. 漏洞预警 | ThinkPHP 5.x远程命令执行漏洞

    ThinkPHP采用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库).RoR的ORM映射和ActiveRecord模式,是一款兼容性高.部署简单的轻量级国产PHP开发框 ...

  7. springboot启动流程(八)ioc容器refresh过程(下篇)

    所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 上一篇文章,我们知道了解析过程将从解析main方法所在的主类开始.在文章的最后我们稍微看 ...

  8. Redis二进制安全概念

    二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改.破译等,如果被攻击,能够及时检测出来. 二进制安全包含了密码学的一些东西,比如加解密.签名等. 举个例子,你把数据1111000 ...

  9. ASE19团队项目 beta阶段 model组 scrum5 记录

    本次会议于12月6日,19时30分在微软北京西二号楼sky garden召开,持续20分钟. 与会人员:Jiyan He, Lei Chai, Linfeng Qi, Xueqing Wu, Kun ...

  10. MySQL主从复制以及在本地环境搭建

    MySQL主从复制原理: master(主服务器),slave(从服务器) MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事binary log ...