题目链接:洛谷

题目大意:给定一个长为$n$的整数序列,求全排列的最大前缀和(必须包含第一个数)之和。

数据范围:$1\leq n\leq 20,1\leq \sum_{i=1}^n|a_i|\leq 10^9$


神级状压dp,不得不服。。。

我们考虑对全排列的最大前缀和的前缀的集合进行dp。

设$f[S],g[S]$分别表示集合$S$内的数组成的排列中,最大前缀和为$sum[S]$和负数的排列数,其中$sum[S]$为$\sum_{i\in S}i$

我们发现,如果这个最大的前缀组成的集合就是$S$,当且仅当前$|S|$个数的最大前缀和为$sum[S]$,后面$n-|S|$个数的最大前缀和为负数,所以

$$ans=\sum_{S\subset U}sum[S]*f[S]*g[U-S]$$

其中$U$表示全集。注意这里$g[S]$必须要求是负数才可以,0不行,否则可能会重复统计。

然后考虑对$f,g$进行dp。

若$sum[S]\geq 0$,则$g[S]=0$,否则枚举最后一个数$j$,即$g[S]=\sum_{j\in S}g[S-\{j\}]$

若$sum[S]\geq 0$,则对于$j\notin S$,$f[S+\{j\}]+=f[S]$,否则$f[S]$对$f[S+\{j\}]$无贡献。

时间复杂度$O(n2^n)$,空间复杂度$O(2^n)$

 1 #include<bits/stdc++.h>
 2 #define Rint register int
 3 using namespace std;
 4 typedef long long LL;
 5 const int N = 1 << 20, mod = 998244353;
 6 int n, lim, sum[N], f[N], g[N], ans;
 7 inline int add(int a, int b){int c = a + b; return c >= mod ? (c - mod) : c;}
 8 int main(){
 9     scanf("%d", &n); lim = 1 << n; g[0] = 1;
10     for(Rint i = 0;i < n;i ++){
11         scanf("%d", sum + (1 << i));
12         f[1 << i] = 1;
13     }
14     for(Rint i = 1;i < lim;i ++)
15         sum[i] = add(sum[i ^ (i & -i)], sum[i & -i]);
16     for(Rint i = 1;i < lim;i ++)
17         if(sum[i] >= 0){
18             for(Rint j = 0;j < n;j ++)
19                 if(!(i & (1 << j))) f[i | (1 << j)] = add(f[i | (1 << j)], f[i]);
20         } else {
21             for(Rint j = 0;j < n;j ++)
22                 if(i & (1 << j)) g[i] = add(g[i], g[i ^ (1 << j)]);
23         }
24     for(Rint i = 1;i < lim;i ++)
25         ans = add(ans, (LL) sum[i] * f[i] % mod * g[lim - 1 - i] % mod) % mod;
26     printf("%d", (ans % mod + mod) % mod);
27 }

Luogu5369

转载于:https://www.cnblogs.com/AThousandMoons/p/10901593.html

Luogu5369 [PKUSC2018]最大前缀和相关推荐

  1. bzoj 5369: [Pkusc2018]最大前缀和

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

  2. 「PKUSC2018」星际穿越 (70分做法)

    5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 27  Solved: 11 [Submit][Statu ...

  3. 胡小兔的 PKUSC2018 游记

    Day 0 一番纠结之后,我还是选择了 PKUSC (Penguin Kingdom University Summer Camp, 企鹅王国大学夏令营)! 理由?扔硬币决定的理由如下: PKU好啊 ...

  4. Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)

    1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...

  5. OpenCV 笔记(04)— OpenCV2 升级到 OpenCV3/CV4 的改动(去掉 CV_前缀、使用新的前缀替换、使用新的命名空间宏)

    1. 由于宏名称的变更照成的"未声明的标识符"系列问题 有时候,遇到此类问题加入一句 #include <cv.h> 便可以让 OpenCV3 或者 OpenCV4 也 ...

  6. Go 学习笔记(59)— Go 第三方库之 etcd/clientv3 封装为方法使用(建立连接、设置key-value、获取key-value、获取带前缀的key-value)

    1. 示例 1 package main import ("context""fmt""go.etcd.io/etcd/clientv3"& ...

  7. LeetCode简单题之检查字符串是否为数组前缀

    题目 给你一个字符串 s 和一个字符串数组 words ,请你判断 s 是否为 words 的 前缀字符串 . 字符串 s 要成为 words 的 前缀字符串 ,需要满足:s 可以由 words 中的 ...

  8. LeetCode简单题之检查单词是否为句中其他单词的前缀

    题目 给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成. 请你检查检索词 searchWord 是否为句子 sentence ...

  9. CSS3无前缀脚本prefixfree.js与Animatable使用介绍

    要求 必备知识 本文要求基本了解 JAVASCRIPT 和 和 CSS3 基本知识. 运行环境 桌面端:IE9 +,Opera 10+,火狐3.5 +,Safari 4+和Chrome浏览器;移动端: ...

最新文章

  1. ONNX MLIR应用示例(含源码链接)
  2. 为何 Map接口不继承Collection接口
  3. LeetCode: 387. First Unique Character in a String
  4. 第一章.良好应用程序基石(2)
  5. Spring的事务管理难点剖析(4):多线程的困惑
  6. Android日志工具Log的使用
  7. IDEA中解决Spring 配置文件未受管束问题,提示:Unmapped Spring configuration files found
  8. 如何在Excel表中快速提取想要的数据
  9. apt-get: command not found解决方案
  10. Mac必备神器之Go2Shell
  11. Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP)
  12. FL Studio水果最新版2023安装图文详细教程
  13. centos7查看磁盘io
  14. 如果取消Windows Ink后ps画笔没有压感
  15. 大学综评自招面试 计算机专业,【荔枝高校大会】自招综评面试6月16日扎堆举行,这些准备工作要做好!...
  16. Hibernate--QBC举例+详解(一)
  17. 【PyTorch】Chapter1:expected dtype Double but got dtype Float
  18. CSDN Chrome浏览器插件
  19. 如何用java取得汉字内码_如何用java随机生成一个汉字?
  20. 在论文写作中使用Excel的技巧

热门文章

  1. 《虚拟化工程师》-真实环境-培训计划 v0.0.1( 赠送:第 01\02 章 (免费视频))...
  2. 互联网秒杀设计--转载
  3. GO语言基础之reflect反射
  4. 新概念英语(1-73)The way to King Street
  5. Tomcat 原理篇
  6. 使用cxf开发webservice应用时抛出异常
  7. 西南交大量子计算机,交大量子光电实验室
  8. python 字符串前面加 f
  9. Asic设计参考工具与参考文档
  10. FPGA作为从机与STM32进行SPI协议通信---Verilog实现