日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P5369-[PKUSC2018]最大前缀和【状压dp】

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P5369-[PKUSC2018]最大前缀和【状压dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P5369


題目大意

一個數列aaa的權值定義為max{∑i=1kai}(k∈[1,n])max\{\sum_{i=1}^ka_i\}(k\in[1,n])max{i=1k?ai?}(k[1,n])
給出nnn個數字,求它們所有排列的權值和

1≤n≤201\leq n\leq 201n20


解題思路

si,fi,gis_i,f_i,g_isi?,fi?,gi?分別表示集合iii的權值和,集合iii的所有排列中最大前綴和為sis_isi?的方案數,集合iii的所有排列中的最大前綴和為負的方案數。那么答案就是
∑i=02n?1fisig2n?1?i\sum_{i=0}^{2^n-1} f_is_ig_{2^n-1-i}i=02n?1?fi?si?g2n?1?i?
sis_isi?很好求。gig_igi?的話我們只轉移si<0s_i<0si?<0的就可以了,fif_ifi?的話我們考慮每次在前面插入一個數,那么只要原來的是最大前綴和,那么插入之后也一定是。

時間復雜度O(2nn)O(2^nn)O(2nn)


code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=21,P=998244353; int n,a[N],lg[1<<N],s[1<<N],f[1<<N],g[1<<N],ans; int main() {scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);for(int i=0;i<n;i++)lg[1<<i]=i;int MS=(1<<n);f[0]=g[0]=1;for(int i=1;i<MS;i++){int p=i&-i;s[i]=(s[i-p]+a[lg[p]])%P;}for(int i=0;i<MS;i++){if(s[i]<0)continue;for(int j=0;j<n;j++){if(i&(1<<j))continue;(f[i|(1<<j)]+=f[i])%=P;}}for(int i=0;i<MS;i++){for(int j=0;j<n;j++){if(i&(1<<j))continue;int z=i|(1<<j);if(s[z]<0)(g[z]+=g[i])%=P;}}for(int i=0;i<MS;i++)(ans+=1ll*f[i]*g[MS-1-i]%P*s[i]%P)%=P;printf("%d\n",(ans+P)%P);return 0; }

總結

以上是生活随笔為你收集整理的P5369-[PKUSC2018]最大前缀和【状压dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。