Poj 2479 Maximum sum

本文介绍了一种解决区间两不相交连续子段和最大问题的方法,通过动态规划算法实现,详细展示了如何计算以每个位置结尾的最大连续子段和,并给出完整的 C++ 代码实现。

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;
	} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值