Description

小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和。
但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案。
小C是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,
现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上n!后对998244353取模的值,显然这是个整数。
注:最大前缀和的定义:i∈[1,n],Sigma(aj)的最大值,其中1<=j<=i

Input

第一行一个正整数nnn,表示序列长度。
第二行n个数,表示原序列a[1..n],第i个数表示a[i]。
1≤n≤20,Sigma(|Ai|)<=10^9,其中1<=i<=N

Output

输出一个非负整数,表示答案。

Sample Input

2
-1 2

Sample Output

3

Solution

首先对于一个序列$[a_1,a_n]$,设最大前缀和的位置为$p$,那么序列$[a_{p+1},a_n]$的任意一个前缀必须都$<=0$。否则的话你用最大前缀和随便加上$[a_{p+1},a_n]$中$>0$的一个前缀就可以得到新的最大前缀和。

预处理:

$sum[S]$表示集合$S$的数字和。

$f[S]$表示钦定集合$S$当最大前缀的合法方案数。

$g[S]$表示集合$S$任意前缀和$<=0$小于$0$的方案数。

那么显然$ans=\sum sum[S]\times f[S]\times g[S']$。其中$S'$是$S$的补集。

$sum$和$g$都是可以直接求的,那么$f$呢?

可以发现,如果$sum[S]>0$,那么把随便一个数放到这个集合$S$的最前面,这个最大前缀和仍然是可以保证合法的。

$ans$最后忘了取模$WA$了好几发……心态崩了

Code

 1 #include<iostream>
 2 #include<cstdio>
 3 #define N (21)
 4 #define MOD (998244353)
 5 using namespace std;
 6
 7 int n,m,a[N],sum[1<<N],cnt[1<<N],f[1<<N],g[1<<N];
 8
 9 int main()
10 {
11     scanf("%d",&n); m=(1<<n)-1;
12     for (int i=1; i<=n; ++i) scanf("%d",&a[i]);
13     for (int i=1; i<=n; ++i)
14         for (int S=0; S<=m; ++S)
15             if (S&(1<<i-1)) sum[S]+=a[i], cnt[S]++;
16
17     for (int S=1; S<=m; ++S)
18     {
19         if (cnt[S]==1) {f[S]=1; continue;}
20         for (int i=1; i<=n; ++i)
21             if ((S&(1<<i-1)) && sum[S]-a[i]>0)
22                 (f[S]+=f[S^(1<<i-1)])%=MOD;
23     }
24
25     g[0]=1;
26     for (int S=1; S<=m; ++S)
27     {
28         if (sum[S]>0) {g[S]=0; continue;}
29         if (cnt[S]==1) {g[S]=1; continue;}
30         for (int i=1; i<=n; ++i)
31             if (S&(1<<i-1))
32                 (g[S]+=g[S^(1<<i-1)])%=MOD;
33     }
34     int ans=0;
35     for (int S=1; S<=m; ++S)
36         (ans+=1ll*sum[S]*f[S]%MOD*g[m^S]%MOD)%=MOD;
37     ans=(ans%MOD+MOD)%MOD;
38     printf("%d\n",ans);
39 }

转载于:https://www.cnblogs.com/refun/p/10158730.html

BZOJ5369:[PKUSC2018]最大前缀和(状压DP)相关推荐

  1. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  2. 【BZOJ4416】阶乘字符串(SHOI2013)-状压DP

    测试地址:阶乘字符串 做法:本题需要用到状压DP. 首先,根据证明(直觉),满足条件的字符串的最小长度仅仅比n2n2n^2小一点点,因此当n>21n>21n>21时,直接输出NO即可 ...

  3. 【算法竞赛学习笔记】状压DP

    title : 状压DP date : 2022-3-5 tags : ACM,图论,动态规划 author : Linno 状压DP 状态压缩,是利用二进制数的性质对问题进行优化的一种算法,经常与搜 ...

  4. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

  5. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  6. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  7. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  8. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  9. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  10. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

最新文章

  1. glob.glob 函数读取文件
  2. 子网掩码的计算与划分详解
  3. BZOJ 2197 [Usaco2011 Mar]Tree Decoration
  4. 研究项目: JBoss架构分析
  5. 玩转Numpy——np.ravel()的使用
  6. SAP 电商云 Spartacus 产品明细页面的 canActivate 执行逻辑 - isUrlProtected
  7. AQS源码阅读笔记(一)
  8. Leetcode--881. 救生艇
  9. Linux下卸载vmware
  10. 霍尼韦尔:物联网“起跑线”上的巨头转型之路
  11. flash builder 4.7 打开闪退解决办法
  12. python进行删除标点符号
  13. 网站的PV是什么意思
  14. 类似 Teambition 的9大最佳项目管理软件
  15. centos 7+ssr傻瓜式安装(仅供学习使用)
  16. ssh登录极路由后台_使用小米路由3G,让普通打印机变成网络打印机
  17. 设备故障率高的四大原因及对策分析
  18. html字体如何运用在ps上,PS新手怎么运用好工作中文本工具
  19. 一起学CC3200系列教程之跑马灯---库
  20. Codeforces——791A Bear and Big Brother

热门文章

  1. linux 移动硬盘 mac,Mac下使用NTFS格式的移动硬盘
  2. 基向量、非基向量、基解(基本解)、可行解、基本可行解、最优解
  3. PPT文件怎么转换成图片
  4. 数据分析-学术前沿趋势分析-论⽂数据统计
  5. nas设备在通用服务器的基础上对文件服务,NAS网络存储设备将取代文件服务器
  6. IPAD2 恢复出厂设置
  7. seige压力测试用法
  8. linux工作中常用文件操作命令
  9. 记录一次redmibook pro15声卡驱动相关问题
  10. 批量微信号码过滤程序