最大双子段和
一个正向取前缀和,一个反向取,最后枚举断点。
#include <bits/stdc++.h> using namespace std; #define ll long long int n,sum; int a[200005]; int front[200005]; int back[200005]; int main(){ ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } front[1]=a[1]; for(int i=2;i<=n;i++){ front[i]=max(front[i-1],0)+a[i]; } for(int i=2;i<=n;i++){ front[i]=max(front[i-1],front[i]); cout<<front[i]<<" "; } cout<<"\n"; back[n]=a[n]; for(int i=n-1;i>=1;i--){ back[i]=max(back[i+1],0)+a[i]; } for(int i=n-1;i>=1;i--){ back[i]=max(back[i+1],back[i]); cout<<back[i]<<" "; } int ans=-1e9; for(int i=2;i<n;i++){ ans=max(ans,front[i-1]+back[i+1]); } cout<<ans; return 0; }
循环双子段和:
也是取反集,减掉。
#include <bits/stdc++.h> using namespace std; #define ll long long int a[200005]; int f[200005]; int b[200005]; int solve(int *a,int n){ f[1]=a[1]; for(int i=2;i<=n;i++){ f[i]=min(f[i-1]+a[i],min(a[i],0)); } for(int i=2;i<=n;i++){ f[i]=min(f[i-1],f[i]); } b[n]=a[n]; for(int i=n-1;i>=1;i--){ b[i]=min(b[i+1]+a[i],min(a[i],0)); } for(int i=n-1;i>=1;i--){ b[i]=min(b[i+1],b[i]); } int ans=1e9; for(int i=2;i<n;i++){ ans=min(ans,f[i-1]+b[i+1]); } return ans; } int main(){ ios::sync_with_stdio(false); int n,sum=0; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; sum+=a[i]; } f[1]=a[1]; for(int i=2;i<=n;i++){ f[i]=max(f[i-1],0)+a[i]; } for(int i=2;i<=n;i++){ f[i]=max(f[i-1],f[i]); } b[n]=a[n]; for(int i=n-1;i>=1;i--){ b[i]=max(b[i+1],0)+a[i]; } for(int i=n-1;i>=1;i--){ b[i]=max(b[i+1],b[i]); } int ans=-1e9; for(int i=2;i<n;i++){ ans=max(ans,f[i-1]+b[i+1]); } ans=max(ans,sum-solve(a,n-1)); ans=max(ans,sum-solve(a+1,n-1)); cout<<ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效