题目大意:求给定的 $n$ 个数的所有排列的最大前缀和(不能为空)之和对 $10^9+7$ 取模的值。

$1\le n\le 20,1\le\sum|a_i|\le 10^9$。


神级DP。杂题选讲的神级毒瘤讲题人CDW讲的。

考虑一个集合 $S$ 能作为最大前缀和出现的方案数。(即贡献系数)

发现前 $|S|$ 个数满足最大前缀和是整个序列,后 $n-|S|$ 个数满足最大前缀和 $<0$。(虽然 $\le 0$ 也行,但为了避免重复统计就要 $<0$)

设 $f[S]$ 为在 $S$ 的所有排列中,最大前缀和 $<0$ 的个数。

设 $g[S]$ 为在 $S$ 的所有排列中,最大前缀和 $=sum[S]$ 的个数。($sum$ 是和)

$f[S]=\begin{cases}0&sum[S]\ge 0\\ \sum\limits_{i\in S}f[S-\{i\}]&sum[S]<0\end{cases}$

初始 $f[0]=1$。

解释一下,如果 $sum[S]\ge 0$,那么最大前缀和不会小于 $0$。否则枚举最后一个数,当且仅当前面的最大前缀和 $<0$ (或者前面没有数,所以 $f[0]=1$)且 $sum[S]<0$ 时才可以。第二个条件已经保证满足了。

$g[S]\rightarrow g[S+(1<<i)](sum[S]\ge 0,i\notin S)$

初始 $g[\{i\}]=1$。

解释一下,考虑从已有状态扩展,枚举在 $S$ 前加一个数 $i$,当且仅当 $S$ 最大前缀和是自己时,新序列最大前缀和才是自己。、

答案为 $\sum sum[S]g[S]f[U-S]$。

时间复杂度 $O(n2^n)$。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,a[],ans,f[],g[];
ll S[];
int main(){
n=read();
FOR(i,,n-) a[i]=read(),g[<<i]=;
FOR(i,,(<<n)-) FOR(j,,n-) if((i>>j)&) S[i]+=a[j];
f[]=;
FOR(i,,(<<n)-){
if(S[i]>=){FOR(j,,n-) if(!((i>>j)&)) g[i|(<<j)]=(g[i|(<<j)]+g[i])%mod;}
else FOR(j,,n-) if((i>>j)&) f[i]=(f[i]+f[i^(<<j)])%mod;
}
FOR(i,,(<<n)-) ans=(ans+1ll*(S[i]+mod)%mod*g[i]%mod*f[((<<n)-)^i])%mod;
printf("%d\n",ans);
}

[PKUSC2018]最大前缀和(状压DP)的更多相关文章

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

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

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

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

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

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

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

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

  5. 【PKUSC2018】【loj6433】最大前缀和 状压dp

    这题吼啊... 然而还是想了$2h$,写了$1h$. 我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的. 那么,我们 令$f[i] ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. WPF Datagrid 控制 第一行和第一列之间的空白

    原文:WPF Datagrid 控制 第一行和第一列之间的空白 这个位置就是 这里 我们更改 DataGridControltemplate 模板 看树形结构 里面是一个BUtton 功能是全选 能找 ...

  2. 将静态页面部署到github.io

    背景:   我的腾讯云服务器是之前利用学生身份(有优惠)买的,现在快到期了,而且服务器上面只有一个引导页(静态页面)还有用,别的项目都没有用了.所以就想找一种不花钱买服务器就可以访问到我的引导页的方法 ...

  3. GCC预编译宏查看

    编译调试代码时,总是遇到要使用编译器预编译宏进行跨平台编译. gcc -E -dM -</dev/null 编译器版本 Thread model: posix gcc version 5.4.0 ...

  4. laravel集成workerman,使用异步mysql,redis组件时,报错EventBaseConfig::FEATURE_FDS not supported on Windows

    由于laravel项目中集成了workerman,因业务需要,需要使用异步的mysql和redis组件. composer require react/mysql composer require c ...

  5. js的promise

    转载自: https://segmentfault.com/a/1190000007032448#articleHeader16 一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学 ...

  6. windows 安装使用jupyter及 基础配置

    jupyter 是什么Jupyter Notebooks 是一个交互式笔记本,支持运行 40 多种编程语言,它的本质是一个 开源的 Web 应用程序,我们可以将其用于创建和共享代码与文档,他可以支持实 ...

  7. springBoot 集成Mysql数据库

    springBoot 集成Mysql数据库 前一段时间,我们大体介绍过SpringBoot,想必大家还有依稀的印象.我们先来回顾一下:SpringBoot是目前java世界最流行的一个企业级解决方案框 ...

  8. 移动应用性能测试剖析以及PerfDog与其他工具的对比分析11.22

    商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 导语: 在IT.互联网及游戏行业,软件测试都是一个重要且不可或缺的过程,测试是软件生命周期中的一个重要阶段,是软件质量保证的关键步骤.目 ...

  9. Pi Network有梦想是好的,最新消息和下载注册流程。

    (注册流程最下面) ---------------------------------------------------------------------------------- 今日更新(10 ...

  10. [20190929]bash使用bc计算的相关问题.txt

    [20190929]bash使用bc计算的相关问题.txt --//快放假没什么事情,使用bash写一些小程序,转化number到oracle number编码,使用bc计算功能,发现一些小问题--/ ...