BZOJ5369:[PKUSC2018]最大前缀和(状压DP)
Description
Input
Output
Sample Input
-1 2
Sample Output
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
#include<iostream>
#include<cstdio>
#define N (21)
#define MOD (998244353)
using namespace std; int n,m,a[N],sum[<<N],cnt[<<N],f[<<N],g[<<N]; int main()
{
scanf("%d",&n); m=(<<n)-;
for (int i=; i<=n; ++i) scanf("%d",&a[i]);
for (int i=; i<=n; ++i)
for (int S=; S<=m; ++S)
if (S&(<<i-)) sum[S]+=a[i], cnt[S]++; for (int S=; S<=m; ++S)
{
if (cnt[S]==) {f[S]=; continue;}
for (int i=; i<=n; ++i)
if ((S&(<<i-)) && sum[S]-a[i]>)
(f[S]+=f[S^(<<i-)])%=MOD;
} g[]=;
for (int S=; S<=m; ++S)
{
if (sum[S]>) {g[S]=; continue;}
if (cnt[S]==) {g[S]=; continue;}
for (int i=; i<=n; ++i)
if (S&(<<i-))
(g[S]+=g[S^(<<i-)])%=MOD;
}
int ans=;
for (int S=; S<=m; ++S)
(ans+=1ll*sum[S]*f[S]%MOD*g[m^S]%MOD)%=MOD;
ans=(ans%MOD+MOD)%MOD;
printf("%d\n",ans);
}
BZOJ5369:[PKUSC2018]最大前缀和(状压DP)的更多相关文章
- [PKUSC2018]最大前缀和——状压DP
题目链接: [PKUSC2018]最大前缀和 设$f[S]$表示二进制状态为$S$的序列,任意前缀和都小于等于$0$的方案数. 设$g[S]$表示二进制状态为$S$的序列是整个序列的最大前缀和的方案数 ...
- LOJ#6433. 「PKUSC2018」最大前缀和 状压dp
原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这 ...
- LOJ 6433 「PKUSC2018」最大前缀和——状压DP
题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...
- 【PKUSC2018】【loj6433】最大前缀和 状压dp
这题吼啊... 然而还是想了$2h$,写了$1h$. 我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的. 那么,我们 令$f[i] ...
- BZOJ_5369_[Pkusc2018]最大前缀和_状压DP
BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...
- 「PKUSC2018」最大前缀和(状压dp)
前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. ...
- Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...
- 【洛谷5369】[PKUSC2018] 最大前缀和(状压DP)
点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一 ...
- T2988 删除数字【状压Dp+前缀和优化】
Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...
随机推荐
- 设计模式之工厂方法(FactoryMethod)模式
在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...
- angularjs 2.0 简单入门1
一:首先要写json文件,并下载所有的包 1,在任意目录下新建文件夹 命名为angular2Dome,也可以使用命令 mkdir angular2Dome 回车. 2,在angular2Dome文件 ...
- php+redis实战留言板(todolist)与互粉功能
目的:通过留言板(todolist)与互粉功能,掌握php操作redis的方法 相关数据操作命令 1,keys * 查看数据库所有的key 2,type + key: 如 type uid 查 ...
- CentOS7下安装caffe(包括ffmpeg\boost\opencv)
因为有项目想采用深度学习,而caffe是深度学习框架中比较理想的一款,并且跨平台,以及可以采用python/matlab的方式进行调用等优势,所以想在服务器上安装,下面就开始了血泪史... 服务器是阿 ...
- JS截取字符串方法实例
// JS截取字符串可使用 substring()或者slice() // // 函数:substring() // 定义:substring(start,end)表示从start到end之间的字符串 ...
- LeetCode题解之Reorder List
1.题目描述 2.题目分析 首先将链表分为两段,然后将后面的一段反转,再合并两个链表. 3.代码 void reorderList(ListNode* head) { if (head == null ...
- 七牛云A账号数据迁移到B账号下
1,七牛云A账号下开启空间授权,可以让B账号可以访问A账号下的空间,,授予权限只读即可. 2,下载七牛云命令行工具.(通过命令完成数据迁移) https://dn-devtools.qbox.me/2 ...
- SQL 中常用存储过程xp_cmdshell运行cmd命令 (转载)
目的:使用SQL语句,在D盘创建一个文件夹myfile 首先查询系统配置 SELECT * FROM sys.configurations WHERE name='xp_cmdshell' OR na ...
- Mysql binlog 无法删除(purge命令无法删除)
1.版本 1)操作系统 cat /etc/issueCentOS release 6.6 (Final)Kernel \r on an \m cat /proc/versionLinux versio ...
- Can't locate Data/Dumper.pm in perl5的处理
Can't locate Data/Dumper.pm in perl5的处理 wget http://www.cpan.org/modules/by-module/Data/Data-Dumper- ...