题目链接:

[PKUSC2018]最大前缀和

设$f[S]$表示二进制状态为$S$的序列,任意前缀和都小于等于$0$的方案数。

设$g[S]$表示二进制状态为$S$的序列是整个序列的最大前缀和的方案数。

设$sum[S]$表示二进制状态为$S$的序列的每个数的和。

那么答案就是$\sum\limits_{S=1}^{2^n-1}sum[S]*g[S]*f[(2^n-1)-S]$。

对于$f[S]$,转移相当于在序列前面加一个数,只有当前集合中数的和小于等于$0$时可以转移。

对于$g[S]$,只能从和大于$0$的子集转移过来。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int mod=998244353;
int sum[3000000];
int f[3000000];
int g[3000000];
int v[3000000];
int n;
int ans;
int mask;
void add(int &x,int y)
{
x+=y;
if(x>mod)x-=mod;
}
int main()
{
scanf("%d",&n);
mask=(1<<n)-1;
for(int i=1;i<=n;i++)
{
scanf("%d",&v[1<<(i-1)]);
}
for(int i=1;i<=mask;i++)
{
sum[i]=sum[i-(i&-i)]+v[i&-i];
}
f[0]=1;
for(int i=1;i<=n;i++)
{
g[1<<(i-1)]=1;
}
for(int i=1;i<=mask;i++)
{
if(sum[i]>0)
{
for(int j=i^mask;j;j-=j&-j)
{
int k=j&-j;
add(g[i|k],g[i]);
}
}
else
{
for(int j=i;j;j-=j&-j)
{
int k=j&-j;
add(f[i],f[i^k]);
}
}
}
for(int i=1;i<=mask;i++)
{
ans=(ans+1ll*g[i]*f[mask^i]%mod*sum[i]%mod)%mod;
}
printf("%d",(ans%mod+mod)%mod);
}

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

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

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

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

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

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

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

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

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

  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. MM-发票校验与收货的差异处理

    SAP FI-财务发票校验修改金额后没有进入差异科目问题:公司新建物料采购订单,在MM科目自动确定配置完成后,做发票校验时,修改金额没修改数量时,差异进入了原材料科目 换采购订单继续测试时,修改金额没 ...

  2. Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值

    JSON是通过键值对表示数据对象的一种格式,其全称为JavaScript Object Notation,它采用完全独立于编程语言的文本格式来存储和表示数据,轻量级.简洁清晰的层次结构.容易解析等特点 ...

  3. ORACLE获取年初年末,月初月末,季度初季度末

    转自:https://www.cnblogs.com/leqhome/p/5319984.html --年初,年末select trunc(sysdate,'yyyy') from dual;sele ...

  4. python3之面向对象编程理解

    面向对象主要有三个特征:封装,继承,多态度. 一.封装 定义类语 class Animal(): class为定义类的关键字,后面跟名字(): python命名规范建议:类一般首字母单词大写,属性变量 ...

  5. LNMP环境中的数据库迁移为独立的服务器

    环境: centos 6.5 ip:192.168.0.118  nginx.php.mysql centos 6.5 ip:192.168.0.117 mysql 现在我们需要把数据库迁移到192. ...

  6. MVC-Session

    1.什么是Session? Session即会话,是指一个用户在一段时间内对某一个站点的一次访问.   Session对象在.NET中对应HttpSessionState类,表示"会话状态& ...

  7. javascript_13-函数是一种数据类型

    函数是一种数据类型 函数是一种数据类型 function var num =60; // 1 函数是一种数据类型 function var myFun = function(){ console.lo ...

  8. C++——Inheritence

    一种错误的观念: 子类继承父类,只把父类的公有成员继承下来,私有的不会继承. 事实上无论是如何继承,都会把父类的所有成员继承下来. #include<iostream> using nam ...

  9. Python将字符串转换成字典

    1. ast包 import ast user_info = '{"name" : "南湖", "gender" : "male& ...

  10. vue项目 npm install 安装依赖 特别慢 解决办法

    使用NPM(Node.js包管理工具)安装依赖时速度特别慢,为了安装Express,执行命令后两个多小时都没安装成功,最后只能取消安装,笔者20M带宽,应该不是我网络的原因,后来在网上找了好久才找到一 ...