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

洛谷题单指南-状态压缩动态规划-P5369 [PKUSC2018] 最大前缀和

原题链接:https://www.luogu.com.cn/problem/P5369

题意解读:求n个数所有排列的最大前缀和之和,求期望要除以n!,此题简化后不需要除以n!。

解题思路:

1、暴力思路

枚举n个数的全排列,针对每个排列求一遍前缀和,取最大值,加总,复杂度n*n!,n最大20,爆了。

2、状压DP

直接考虑最大前缀和的取值,可能性就是在n个数中任选0~n个数之和,一共2^n种可能;

然后,针对每一种最大前缀和,求出一共有多少个排列符合要求。

对于一个排列1~n,如果1~i是最大前缀和,那么这个排列有如下两个性质:

性质一:1~i的数的任何排列,都符合后缀和>=0,这样才能保证最大前缀和取到i;

性质二:i+1~n的数的任何排列,都符合前缀和<0,这样才能保证最大前缀和不取i之后的数。

基于以上性质,设状态s,其中位置是1表示选了的数,sum[s]表示s中所选数之和,

设f[s]表示s中所有数组成的排列中,最大前缀和是sum[s]的方案数;

设g[s]表示s中所有数组成的排列中,最大前缀和<0的方案数;

这样,一个排列可以拆分成s和((1 << n) - 1) ^ s两部分来考虑,两部分的数量就是f、g的含义,乘法原理乘起来就是总的数量,

那么,答案显然是:∑ sum[s] * f[s] * g[((1 << n) - 1) ^ s]

如何计算f?

基于性质一,如果n个数的排列中,最大前缀和为sum[s],如果sum[s]>=0,那么在s中所有数排列前面增加任意一个数,得到新的状态t,这时最大前缀和则是sum[t],说明f[s]对f[t]产生贡献。

因此有:f[t] +=  f[s],(t = s | (1 << i),(s >> i & 1) == 0)

如何计算g?

基于性质二,如果s中所有数的最大前缀和sum[s]<0,那么可以枚举排在最后一个的数,如果除去排在最后一个的数,其余的数最大前缀和依然<0,设其余数的状态为t,说明g[t]对g[s]产生贡献。

因此有:g[s] = ∑ g[t],(t = s - (1 << i), (s >> i & 1) != 0)

编程时注意取模。

100分代码:

#include <bits/stdc++.h>
using namespace std;const int N = 20, MOD = 998244353;
int f[1 << N], g[1 << N];
int sum[1 << N];
int a[N];
int n, ans;int main()
{cin >> n;for(int i = 0; i < n; i++) cin >> a[i];//预处理sumfor(int i = 0; i < 1 << n; i++)for(int j = 0; j < n; j++)if(i >> j & 1) sum[i] += a[j];//计算ffor(int i = 0; i < n; i++) f[1 << i] = 1; //集合只有一个数的方案数是1for(int s = 0; s < 1 << n; s++){if(sum[s] >= 0)for(int i = 0; i < n; i++)if(!(s >> i & 1))f[s | (1 << i)] = (f[s | (1 << i)] + f[s]) % MOD;}//计算gg[0] = 1; //初始化for(int s = 1; s < 1 << n; s++)if(sum[s] < 0)for(int i = 0; i < n; i++)if(s >> i & 1)g[s] = (g[s] + g[s - (1 << i)]) % MOD;for(int s = 0; s < 1 << n; s++)ans = (ans + 1ll * sum[s] * f[s] % MOD * g[((1 << n) - 1) ^ s] % MOD) % MOD;cout << (ans + MOD) % MOD; //避免负数return 0;
}

 

http://www.sczhlp.com/news/45920/

相关文章:

  • 毕业设计医院网站设计怎么做sem优化推广
  • 深圳建筑设计师招聘信息百家号seo怎么做
  • 设计师的个人网站灰色词排名接单
  • 做网站平台客服有什么好苏州网站外包
  • 公司如何组建网站百度大搜推广和百度竞价
  • 新手初做网站做一个企业网站大概需要多少钱
  • sss
  • 光纤数据收发加速计算卡设计原理图:226-基于Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 四路光纤卡
  • 云主机 怎么做网站建站系统哪个好
  • 昆明做网站开发维护的公司如何申请域名
  • 开一家代做网站的公司网站内链优化
  • 网投怎么做网站win10优化大师官网
  • 香港做批发的网站有哪些seo诊断书
  • 南坪做网站搜易网服务内容
  • 磁力神器河南纯手工seo
  • wordpress布局构建器seo网站推广是什么意思
  • 网站模板制作视频教程网站优化及推广方案
  • 语言网站开发千峰培训多少钱
  • PPT处理控件Aspose.Slides教程:在 C# 中将 PPTX 转换为 Markdown
  • QOJ1087
  • 视频分析平台如何实现自动化学习
  • 服务器网站备案万词霸屏百度推广seo
  • 分享信息的网站产品推广方案范例
  • 南京网络推广网站建设公司阿里妈妈推广网站
  • 黔南网站建设多少钱应用商店搜索优化
  • 家政门户网站源码手机优化助手下载
  • 网站做电源营销软文500字范文
  • 深圳市网站制作网络营销专业就业方向
  • 班级设计网站建设全网整合营销平台
  • 宣传网站模板seo网站