MuQ~1WA了...嘲讽下...
1Y
裸地dp
和校赛的那个区间非常想
题意是数列两不想交连续子段和最大
DP
wl,wr,sum都没有用上....懒得改了
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 50010
int a[N],sum[N],n;
int lmax[N],wl[N]; //表示以i为结束的最大连续字段和
int rmax[N],wr[N];
int ldp[N],rdp[N];
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)scanf("%d",&a[i]);
sum[0]=0;
for(i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
lmax[1]=a[1],wl[1]=1;
for(i=2;i<=n;i++){
if(lmax[i-1]>0){lmax[i]=lmax[i-1]+a[i];wl[i]=wl[i-1];}
else {lmax[i]=a[i];wl[i]=i;}
}
rmax[n]=a[n],wr[n]=n;
for(i=n-1;i>=1;i--){
if(rmax[i+1]>0){rmax[i]=rmax[i+1]+a[i];wr[i]=wr[i+1];}
else {rmax[i]=a[i];wr[i]=i;}
}
ldp[1]=lmax[1];
for(i=2;i<=n;i++)ldp[i]=max(lmax[i],ldp[i-1]);
rdp[n]=rmax[n];
for(i=n-1;i>=1;i--)rdp[i]=max(rmax[i],rdp[i+1]);
int res=ldp[1]+rdp[2];
for(i=2;i<n;i++)res=max(res,ldp[i]+rdp[i+1]);
printf("%d\n",res);
}
return 0;
}
本文介绍了一种解决区间两不相交连续子段和最大问题的方法,通过动态规划算法实现,详细展示了如何计算以每个位置结尾的最大连续子段和,并给出完整的 C++ 代码实现。
898

被折叠的 条评论
为什么被折叠?



