当前位置: 首页 > news >正文

P5369 最大前缀和

P5369 最大前缀和

题目

题目描述

小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和。

但是小 C 并不会做这个题,于是小 C 决定把序列随机打乱,然后取序列的最大前缀和作为答案。

小 C 是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上 \(n!\) 后对 \(998244353\) 取模的值,显然这是个整数。

注:最大前缀和的定义:\(\forall i \in [1,n]\)\(\sum_{j=1}^{i}a_j\)的最大值。

对于\(100\%\)的数据,满足\(1\leq n\leq 20\)\(\sum_{i=1}^{n}|a[i]|\leq 10^9\)

思路

看到 \(n\le 20\) 想到状压dp。

考虑集合 \(S\) 的元素作为前缀和的方案数,设 \(f_S\) 表示 \(S\) 的元素作为前缀的方案数, \(g_S\) 表示 \(S\) 中的元素作为后缀不改变最大前缀,即 \(S\) 中的元素的最大前缀和小于 \(0\) 的方案数,\(sum_S\) 表示 \(S\) 中的元素的和。则有:

\[ans=\sum sum_S\times f_S \times g_{\complement_U S} \]

\(sum\) 可以直接求, \(g\) 容易求,有 \(g_S=\sum g_T [T=S-(w)\and sum_S>=0]\)

若按照从前往后的顺序求 \(f\) ,需要枚举最大前缀和的位置,难以转移。

考虑正难则反。向后插入点难以处理,则在前面插入点。

若当前排列 \(a_1,a_2,a_k\) 为最大前缀和,则 \(a_2,a_k\) 也为最大前缀和。

因此有 \(f_S\) 转移到 \(f_{T=S\or w}\) 的条件为 \(sum_T>a_w\)

注意

时刻取模。

http://www.jsqmd.com/news/31531/

相关文章:

  • 奋飞咨询:以专业之光,照亮企业可持续发展通途
  • 日总结 21
  • cpp生成1到n生成全排列的三种方法
  • CF1815D
  • 南京大学/NJU 人工智能/AI 计算机系统基础/ICS 编程作业/PA 记录
  • 直播带货话术不会写?这个AI指令帮你搞定
  • Java数组——数组的使用
  • NOIP2025加训
  • 20232427 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • Windows 系统下通过 VMware 17 安装 macOS 的教程
  • 【Redis】实操:cluster集群部署
  • 2025.11.4 - A
  • 移动通信基站
  • kaggle提交 名字不是submission.csv的提交方法
  • 实用指南:【Nest】登录鉴权
  • 程序员修炼之道:从小工到专家-2
  • 设计模式--外观模式:简化繁琐环境的统一接口
  • 从零实现3D Gaussian Splatting:完整渲染流程的PyTorch代码详解
  • NOIP2025模拟1
  • 文生视频时代,RustFS如何成为AI资产库的最佳底座?
  • HTTP 与 SOCKS5 代理协议:企业级选型指南与工程化实践
  • NOIP2025 游记
  • 用 CodeBuddy CLI + Prompt,从零到可运行:前后端混合管理强大的系统的高效实战
  • P16.土堆说卷积(可选看)
  • 25.11.4联考题解
  • d11.4t4 answer
  • 详细介绍:当AI化身数据炼金术士:初级Python开发者如何将创意炼成黄金代码?—— 老码农的炼金术指南
  • 【学习笔记】kafka权威指南——第3章 kafka生产者—向kafka写入资料
  • P15.神经网路的基本骨架——nn.Module的使用
  • function