PKUSC2018 最大前缀和
题意
给一个长度为
解法
设全集为
后者可以枚举最后一个数填什么转移,前者可以枚举上一个取到严格最大前缀和的子集是哪一个转移,需要注意处理只选一个数的边界情况,复杂度是
一个精妙的 trick 是考虑
code
代码的边界很不好写。
#include<bits/stdc++.h> using namespace std; using E=long long; const E mod=998244353; int n; vector<E> a; int main(){ cin>>n; a.resize(n); for(int i=0; i<n; i++){ cin>>a[i]; } vector<E> f(1<<n),g(1<<n),sum(1<<n); f[0]=g[0]=1; for(int msk=1; msk<(1<<n); msk++){ for(int i=0; i<n; i++) if(msk>>i&1) sum[msk]+=a[i]; if(sum[msk]<=0) for(int i=0; i<n; i++){ if((msk>>i&1)==0) continue; g[msk]=(g[msk]+g[msk^(1<<i)])%mod; } if((msk&-msk)==msk) f[msk]=1; else for(int i=0; i<n; i++){ if(msk>>i&1) if(sum[msk^(1<<i)]>0) f[msk]=(f[msk]+f[msk^(1<<i)])%mod; } } E ans=0; for(int msk=1; msk<(1<<n); msk++){ sum[msk]%=mod; ans=(ans+f[msk]*g[((1<<n)-1)^msk]%mod*sum[msk])%mod; //cerr<<msk<<' '<<f[msk]<<' '<<ans<<endl; } cout<<(ans%mod+mod)%mod; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】