最大双子段和

一个正向取前缀和,一个反向取,最后枚举断点。

#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;
}
posted @   sad_lin  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示