深刻感受到自己的水平和机房里的其他人相差甚远,他们都是随手秒这个题的...

$n$很小,考虑状压DP

当一个序列在某个位置取到最大前缀和后,意味着如果把后面的数抽出来单独成序列,那么它的每个前缀和都$\leq0$,要不然就可以取到更大的前缀和了

令$s_i$表示状态为$i$的数的和,$f_i$表示选状态为$i$的数且最大前缀和$=s_i$的方案数,$g_i$表示选状态为$i$的数且每个前缀和都$\leq0$的方案数,那么答案就是$\sum\limits_is_if_ig_{mx-i}$

如果$s_i\gt0$,那么我们在$i$这个状态代表的序列前面加任何一个数,新的序列的最大前缀和肯定是总和,所以我们有转移$f_{j\cup i}\gets f_i(i\cap j=\varnothing)$

如果$s_i\leq0$,那么我们在$i$这个状态代表的序列末尾删除一个数得到的序列仍然满足条件,所以我们有转移$g_i\gets g_{i-j}(i\cap j\ne\varnothing)$

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

#include<stdio.h>
const int maxn=1048576,mod=998244353;
typedef long long ll;
int a[20],s[maxn],f[maxn],g[maxn];
void inc(int&a,int b){(a+=b)%=mod;}
int main(){
	int n,i,j,mx,ans;
	scanf("%d",&n);
	for(i=0;i<n;i++)scanf("%d",a+i);
	mx=1<<n;
	for(i=0;i<mx;i++){
		for(j=0;j<n;j++){
			if(i>>j&1)s[i]+=a[j];
		}
	}
	g[0]=1;
	for(i=0;i<mx;i++){
		if(s[i]<=0){
			for(j=0;j<n;j++){
				if(i>>j&1)inc(g[i],g[i^(1<<j)]);
			}
		}
	}
	for(i=0;i<n;i++)f[1<<i]=1;
	for(i=0;i<mx;i++){
		if(s[i]>0){
			for(j=0;j<n;j++){
				if(~i>>j&1)inc(f[i^(1<<j)],f[i]);
			}
		}
	}
	ans=0;
	for(i=0;i<mx;i++)inc(ans,s[i]*(ll)f[i]%mod*(ll)g[(mx-1)^i]%mod);
	inc(ans,mod);
	printf("%d",ans);
}

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

  1. 「PKUWC2018/PKUSC2018」试题选做

    「PKUWC2018/PKUSC2018」试题选做 最近还没想好报THUSC还是PKUSC,THU发我的三类约(再来一瓶)不知道要不要用,甚至不知道营还办不办,协议还有没有用.所以这些事情就暂时先不管 ...

  2. 【LOJ6433】【PKUSC2018】最大前缀和

    [LOJ6433][PKUSC2018]最大前缀和 题面 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做这个题,于是小 C ...

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

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

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

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

  5. [LOJ6433] [PKUSC2018] 最大前缀和

    题目链接 LOJ:https://loj.ac/problem/6433 Solution 注意到最大前缀要满足什么性质,假设序列\(a[1..n]\)的最大前缀是\(s_x\),那么显然要满足所有\ ...

  6. [LOJ6433][PKUSC2018]最大前缀和:状压DP

    分析 我们让每个数列在第一个取到最大前缀和的位置被统计到. 假设一个数列在\(pos\)处第一次取到最大前缀和,分析性质,有: 下标在\([1,pos]\)之间的数形成的数列的每个后缀和(不包括整个数 ...

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

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

  8. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  9. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

随机推荐

  1. 禁止 iphone 网页上下拖动露底

    document.addEventListener('touchmove', function(e) { e.preventDefault();});

  2. SICAU-OJ: 第k小

    第k小 题意: 给出一个长度不超过5000的字符串,然后让你找出第K小的字串(1<=K<=5).重复的串大小相等. 题解: 这里我们知道某些串的前缀是肯定小于等于其本身的. 那么长度为5的 ...

  3. CSS中background-position使用技巧

    一.background-position:left top; 背景图片的左上角和容器(container)的左上角对齐,超出的部分隐藏.等同于 background-position:0,0;也等同 ...

  4. hdu 1399 Starship Hakodate-maru (暴力搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1399 题目大意:找到满足i*i*i+j*(j+1)*(j+2)/6形式且小于等于n的最大值. #inc ...

  5. CentOS 7 主机加固手册-中

      CentOS 7 主机加固手册-上 CentOS 7 主机加固手册-中 CentOS 7 主机加固手册-下 0x0c 设置/boot/grub2/grub.cfg权限 Set grub.conf ...

  6. bzoj 4569 [Scoi2016]萌萌哒 并查集 + ST表

    题目链接 Description 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每 ...

  7. 字符设备驱动ioctl实现用户层内核层通信

    测试代码实现 memdev.h #ifndef _MEMDEV_H_ #define _MEMDEV_H_ #include<linux/ioctl.h> #ifndef MEMDEV_M ...

  8. linux系统备份脚本

    前言 之前写过<<linux系统简单备份的脚本>>, 最开始一直用着,后来觉得有必要改进下它,不管是从操作方式上还是脚本的工作方式上.之所以这么看重备份,是因为我经历过磁盘损坏 ...

  9. python基础===正则表达式(转)

    正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能 ...

  10. (12)Linux shell之read 用法

    Linux shell之read 用法 #!/bin/bash#read 用来读取屏幕输入或是读取文件内容.read -p  "please input you  name: " ...