基于ssh框架的网站开发流程图,杨和关键词优化,网站代理浏览器7,装潢设计学校正题
题目链接:https://www.luogu.com.cn/problem/P5369 题目大意
一个数列aaa的权值定义为max{∑i1kai}(k∈[1,n])max\{\sum_{i1}^ka_i\}(k\in[1,n])max{∑i1kai}(k∈[1,n]) 给出nnn个数字#xff0c;求它们所有排列的权值和 1≤n≤201\leq n\leq 201≤n≤20 解题思路 …正题
题目链接:https://www.luogu.com.cn/problem/P5369 题目大意
一个数列aaa的权值定义为max{∑i1kai}(k∈[1,n])max\{\sum_{i1}^ka_i\}(k\in[1,n])max{∑i1kai}(k∈[1,n]) 给出nnn个数字求它们所有排列的权值和
1≤n≤201\leq n\leq 201≤n≤20 解题思路
设si,fi,gis_i,f_i,g_isi,fi,gi分别表示集合iii的权值和集合iii的所有排列中最大前缀和为sis_isi的方案数集合iii的所有排列中的最大前缀和为负的方案数。那么答案就是 ∑i02n−1fisig2n−1−i\sum_{i0}^{2^n-1} f_is_ig_{2^n-1-i}i0∑2n−1fisig2n−1−i sis_isi很好求。gig_igi的话我们只转移si0s_i0si0的就可以了fif_ifi的话我们考虑每次在前面插入一个数那么只要原来的是最大前缀和那么插入之后也一定是。
时间复杂度O(2nn)O(2^nn)O(2nn) code
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N21,P998244353;
int n,a[N],lg[1N],s[1N],f[1N],g[1N],ans;
int main()
{scanf(%d,n);for(int i0;in;i)scanf(%d,a[i]);for(int i0;in;i)lg[1i]i;int MS(1n);f[0]g[0]1;for(int i1;iMS;i){int pi-i;s[i](s[i-p]a[lg[p]])%P;}for(int i0;iMS;i){if(s[i]0)continue;for(int j0;jn;j){if(i(1j))continue;(f[i|(1j)]f[i])%P;}}for(int i0;iMS;i){for(int j0;jn;j){if(i(1j))continue;int zi|(1j);if(s[z]0)(g[z]g[i])%P;}}for(int i0;iMS;i)(ans1ll*f[i]*g[MS-1-i]%P*s[i]%P)%P;printf(%d\n,(ansP)%P);return 0;
}